6

Rails開発ログでMySQLステートメントを生成したコード行を見つける方法はありますか?

パフォーマンスの最適化を行うために、アプリのどの部分がどの MySQL クエリを作成しているかを調べたいと考えています。ログを見ると、Web リクエストごとに何百ものクエリが点滅しているので、それらがどこから来たのかを突き止める必要があります。

ログ出力に____FILE____や などの変数を追加することを考えています。____LINE____

それは可能ですか?

4

2 に答える 2

4

https://github.com/lightyear/sql-loggingは、すべてのSQLクエリのバックトレースに加えて、一連の有用な統計を提供します。

于 2012-10-01T15:52:57.773 に答える
1

いくつかのオプションがあります。これらのオプションはいずれも、Ruby のエラー時のバックトレースとまったく同じ方法でバックトレースを提供するものではありませんが、SQL クエリがどこから来ているかを正確に追跡するために必要なツールと情報を提供します。

  1. 通常の Rails ログ エントリは次のようになります。

    Started GET "/login" for 127.0.0.1 at Thu Sep 27 18:59:08 -0500 2012
      Processing by PublicController#index as HTML
      (40.9ms)  SELECT COUNT(*) FROM "studies" 
      (49.6ms)  SELECT COUNT(DISTINCT "activities"."whodiddit") FROM "activities" 
      (35.3ms)  SELECT COUNT(*) FROM "involvements" 
    

    これは、何百もの SQL クエリが発生している場所だと思いますか?

    Rendered partials/_faq.haml (6.1ms)
    Rendered public/index.html.haml within layouts/public (114.3ms)
    Completed 200 OK in 595ms (Views: 276.7ms | ActiveRecord: 151.6ms)
    

    したがって、上部には HTTP 動詞GETとルート (/login私の例では)、およびそれが由来するホストがあります。その後、Rails はどのコントローラーとアクションがトリガーされるかを通知します。

    注:で始まる行が表示されている場合はRendered...、ビューがレンダリングされています。レンダーの後に来る SQL クエリは、SQL クエリがビューでトリガーされていることを示します (コントローラーの外部など)。少しだけ考えてみてください。ビューが呼び出すコードによっては、SQL クエリをトリガーする実際の行が、ヘルパー、モデル、またはビュー コードが呼び出すその他の場所に埋もれている可能性があります。

    Processing by PublicController#index as HTML
    

    最後のas HTMLビットは、リクエストがどのような形式で送信されたかを示しているため、おそらく応答でどのビュー/形式が使用されるかがわかります。

    つまり、基本的には、SQL クエリが のindexアクションの一部としてPublicController、またはこのアクションがトリガーされた結果としてそのコントローラーがレンダリングするビューの 1 つとしてトリガーされたことを示しています。

  2. 解析するものが多すぎる場合は、debuggerコマンドを使用してさまざまなポイントで出力を停止し、何が起こっているかを調べることができます。デバッガーの詳細については、こちらをご覧ください。

  3. Rails.logger.info "My info message"orを使用Rails.logger.error "My error message"して (デフォルトまたはエラー ログなどに入れるかどうかに応じて)、アプリ ログに直接出力することができます。

于 2012-09-28T00:19:53.330 に答える