1

これが私の production.log のスニペットです。

Started GET "/product/514034/754240" for XX.XX.202.138 at 2012-06-21 11:52:28 -0700


Started GET "/product/614409/666897" for XX.XX.228.38 at 2012-06-21 11:52:28 -0700
Processing by ProductsController#show as HTML
  Parameters: {"category_id"=>"514034", "product_id"=>"754240"}
Processing by ProductsController#show as HTML
  Parameters: {"category_id"=>"614409", "product_id"=>"666897"}
Logged in 2940659 via auth cookie
Logged in 585210 via auth cookie
[e3e3fc56bb6bd137741b269ee397683c] [2940659] Read fragment views/global-caches/header (0.7ms)
[e3e3fc56bb6bd137741b269ee397683c] [2940659]   Rendered shared/_email_form.html.haml (0.7ms)
[d81bb986be5acc0277c0c9e11b414249] [585210] Read fragment views/global-caches/sharebar-message (0.7ms)
[d81bb986be5acc0277c0c9e11b414249] [585210]   Rendered shared/_email_form.html.haml (0.7ms)
...

ご覧のとおり、2 人の異なるユーザーの 2 つの同時セッションが同じログ ファイルに同時に記録されています。これにより、ログを解析して、各種類のページの生成にかかった時間などを判断することができなくなります。これは、エントリが次の順序で予期されていないためです。

Started GET "/URL/BLAH" for IP at DATE
... stuff...
Completed 200 OK in XXms (ActiveRecord: YY.Yms)

代わりに、次のような予測できないインターリーブされたログを取得します。

Started GET "/URL/BLAH" for IP at DATE

Started GET "/URL/BLAH" for IP at DATE
... stuff...
Completed 200 OK in XXms (ActiveRecord: YY.Yms)
...stuff...
Completed 200 OK in XXms (ActiveRecord: YY.Yms)

したがって、「完了」と「開始」を一致させることは不可能です。

私が望むのは、各子プロセスが独自のログなどに書き込む方法です。または、各ページビューのログをアトミックに書き込む方法が可能である場合、それは不可能または困難であるか、パフォーマンスが低下する可能性があります。

4

1 に答える 1

3

Rails 3.2 は素晴らしいオプション config.log_tag を提供します

production.rb に以下を追加できます:

config.log_tags = [ lambda { Time.now.to_i }]

したがって、ログの各行の前に数字が追加されます。例:

[1351867173] 127.0.0.1 の GET "/" を 2012-11-02 16:39:33 +0200 で開始
[1351867173] RecipesController#main で HTML として処理

ログはまだシャッフルされていますが、正規化して並べ替えることができます。

sort -f -s -k1.1,1.11 production.log | sed の/^..............//' > sorted_production.log

(最初のシンボルで (タイムスタンプで) 並べ替え、sed でタイムスタンプを削除)

ログを簡単に分析できるようになりました。

さらに、レール 3.2.9には関連する問題https://github.com/rails/rails/pull/7317
の修正があり ます。
下手な英語でごめんなさい...)

于 2012-11-02T17:46:33.393 に答える