Rails開発ログでMySQLステートメントを生成したコード行を見つける方法はありますか?
パフォーマンスの最適化を行うために、アプリのどの部分がどの MySQL クエリを作成しているかを調べたいと考えています。ログを見ると、Web リクエストごとに何百ものクエリが点滅しているので、それらがどこから来たのかを突き止める必要があります。
ログ出力に____FILE____
や などの変数を追加することを考えています。____LINE____
それは可能ですか?
Rails開発ログでMySQLステートメントを生成したコード行を見つける方法はありますか?
パフォーマンスの最適化を行うために、アプリのどの部分がどの MySQL クエリを作成しているかを調べたいと考えています。ログを見ると、Web リクエストごとに何百ものクエリが点滅しているので、それらがどこから来たのかを突き止める必要があります。
ログ出力に____FILE____
や などの変数を追加することを考えています。____LINE____
それは可能ですか?
https://github.com/lightyear/sql-loggingは、すべてのSQLクエリのバックトレースに加えて、一連の有用な統計を提供します。
いくつかのオプションがあります。これらのオプションはいずれも、Ruby のエラー時のバックトレースとまったく同じ方法でバックトレースを提供するものではありませんが、SQL クエリがどこから来ているかを正確に追跡するために必要なツールと情報を提供します。
通常の 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 つとしてトリガーされたことを示しています。
解析するものが多すぎる場合は、debugger
コマンドを使用してさまざまなポイントで出力を停止し、何が起こっているかを調べることができます。デバッガーの詳細については、こちらをご覧ください。
Rails.logger.info "My info message"
orを使用Rails.logger.error "My error message"
して (デフォルトまたはエラー ログなどに入れるかどうかに応じて)、アプリ ログに直接出力することができます。