6

Rails開発ログにMySQLステートメントを生成したコード行を見つける方法はありますか?SQLクエリからアプリケーションコードへのバックトレース?

パフォーマンスの最適化を行うために、私のアプリケーションのどの部分がどのMySQLクエリを作成しているのかを知りたいと思います。私のログを見てみると、私がやるWebリクエストごとに、hundresのクエリが点滅しているのがわかります。どこから来たのかを知る必要があります。

____FILE________LINE____のような変数をログ出力に追加することを考えています。

これは可能ですか?

答えて

4

は、すべてのSQLクエリと有用な統計情報のバックトレースを提供します。

+0

rails 2.xのプラグインを入手する場所を知っていますが、ウェブサイトにあるsvn repoがダウンしているようです。 –

+0

私たちはRails 2のためにquery_traceを使用しています。https://github.com/ntalbott/query_trace –

+0

それをやった!!!!ありがとう! –

1

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

  1. あなたの典型的なRailsはエントリは次のようなものになりますログ:SQLクエリのあなたの何百も起こっているところ、私はこれを推測している

    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" 
    

    はありますか?

    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ビットは、要求が来たようで、そのためのビュー/フォーマットはおそらく応答で使用されるフォーマットかを表示します。

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

  2. 構文解析が多すぎる場合は、debuggerコマンドを使用して、さまざまな時点で出力を停止し、何が起こっているのかを調べることができます。 debugger hereの詳細

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

+0

"SQLクエリをトリガする実際の行は、ヘルパー、モデル、またはビューコードが呼び出す他の場所に埋め込むことができます。「 何イムは、作成されたログの一部が何であるかのモジュールまたはクラスから? をそのを見つけるためにモデルオーデルヘルパーは、など。まさに... は、それが可能であるから、外で発見しようとしている? (40.9ms)「研究」からSELECT COUNT(*) (49.6ms)SELECT COUNT(DISTINCT "活動"、 "whodiddit") "活動"から (35.3ms) "関与する"から選択してください(*) –

+0

あなたはいくつかのコードとログの一部を投稿していますか?SQLクエリがどこから来ているのかを知ることは難しいことではありませんが、実際のコードや関連するログを投稿する必要があります。あなたの現在の質問でできることは、あなたの質問がプットであるため、一般的なアドバイスを与えることです一般的には一般的です。 – jefflunt

+0

私が投稿したログからは、ビューがレンダリングされるログ行の前にSQLが記録されるため、SQLがコントローラ(またはそれが呼び出すメソッドの1つ)で発生し、ビューではないことがわかります。そのことを理解することは、主にRails呼び出しの流れを理解することにあります。リクエストが来ると、コントローラーアクションにルーティングされ、アクションコードが実行され、ビューがレンダリングされます(つまり、ビュー内の埋め込みコードが実行されます)。ログは、いつ実行されるのかの時系列になっています。 – jefflunt

関連する問題