シーンの設定
デフォルトの Rails ロギングを本番環境でより役立つものにするために、私は Log4r とその診断コンテキスト、特にMDCを利用してきました。Rails アプリケーション自体から出力されるログに加えて、Rack ミドルウェアでも一貫したログを取得できるように、独自のミドルウェアもいくつか挿入しています。
たとえば、ログインしているユーザーに Warden 経由でアクセスできるようになるとすぐに、その部分に必要な MDC エントリを追加します。
def call(env)
user = env['warden'].user
user_context = user ? user.to_log_format : 'indetermined'
MDC.put :user, user_context
@app.call(env)
end
Rack ミドルウェアに記録される他のものは、親 PID、リクエスト ID などです。
問題
問題は、ログ エントリが著しく間違っていることです。負荷がかかると、1 人のユーザーの ID が、まったく別のユーザーが API に対して行ったであろう要求と混ざり合っていることが常にわかります。
Log4r MDC はスレッドセーフで、Rails 4 はデフォルトでスレッドセーフであると言われていますが、明らかに何かが正しくありません。Rack が問題なのかどうかも疑問に思っていましたが、Rails のスレッド セーフ性 (完全に一言で言えば、Rails ではRack::Lockを削除するのに十分な自信があるようです) と思われますが、それも正しくないようです。
私は何が欠けていますか?すべての情報はスレッドセーフであると言っているようですが、そうであるとは確信していません。
フードの下
- レール 4.1.10
- Log4r 1.1.10
- 乗客 4.0.59