2011-12-24 3 views
4

私の考えは、session_idをキャプチャしてスレッドローカルストレージに格納することです。どのようにすべてのログメッセージ(Rails 3)にセッションIDを付加するのですか?

Thread.current[:session_id] = session[:session_id] 

ただし、フィルタが呼び出される前にいくつかのレールロギングが発生します。

ミドルウェアプラグインを作成してsession_idを取得する可能性があると考えました。しかし、再び、私はすべてのロギングのために十分に早くそれを得るようには思わない。

session_idを取得できる最も早いのは何ですか?

ありがとうございます!

答えて

5

は、私がlog_tags次のように設定できますRails 3.2.3では、ActiveRecordのセッションストアが使用されています。 ActiveSupport::TaggedLoggingとRailsの3.2の場合

+1

Rails 3.2以降が利用可能な場合、これはよりクリーンなアプローチです。 – mahemoff

+1

これはsession_idではなく、Base64クッキー全体です。 session_idを記録する場合は、http://stackoverflow.com/a/22487412/117382を参照してください。 – jBilbo

2

さて、私はこれを最後に考え出しました。

  1. 私はActionDispatch::Session::CookieStore方法以前のラックスタック内ActionDispatch::Cookiesを移動し、。これは安全であるように見え、セッションが初期化される前にいくつかのロギングが発生するため、必要です。

  2. スレッドローカルストアにsession_idを設定する独自のラックミドルウェアコンポーネントが追加されました。

  3. 私はレールロガーを無効にし、各ログメッセージの前にsession_idを付加します。

これは、特定のユーザーセッションのすべてのログを分離して分析できることに非常に役立ちます。

他の人がどのようにこれを達成しているか知りたいです。それは働いて

config.log_tags = [ :uuid, :remote_ip, 
        lambda {|req| "#{req.cookie_jar["_session_id"]}" } ] 

:3.2サポートはlog_tags設定配列を使用してロギングをタグ付きのRails、log_tags配列PROCオブジェクトを受け入れ、およびPROCオブジェクトはリクエストオブジェクトで呼び出されているので

+2

ActiveSupport :: TaggedLoggingを見ると、Railsロガーの猿のパッチを避けるのに役立ちます。 –

1

、あなたが:cookie_storeを使用している場合:

config.log_tags = [ :uuid, :remote_ip, 
        lambda { |r| "#{r.cookie_jar.signed["_session_id"]["session_id"]}" } ] 

注:config/initializers/session_store.rb

関連であなたの:key値で"_session_id"を変更:フェリックスさん@に基づいてhttps://stackoverflow.com/a/22487360/117382

1

を回答。 (これはマルチテナントアプリです)

I, [2015-11-05T15:45:42.617759 #22056] INFO -- : [verimor/2] [77e593dc-c852-4102-a999-5c90ea0c9d66] Started GET "/home/dashboard" for 192.168.1.37 at 2015-11-05 15:45:42 +0200 

[verimor/2]subdomain/user_idです:

# config/application.rb 
config.middleware.delete "ActionDispatch::Cookies" 
config.middleware.delete "ActionDispatch::Session::CookieStore" 
config.middleware.insert_before Rails::Rack::Logger, ActionDispatch::Cookies 
config.middleware.insert_before Rails::Rack::Logger, ActionDispatch::Session::CookieStore 

# config/environment/development.rb and production.rb 
config.log_tags = [ 
    lambda {|req| "#{req.subdomain}/#{req.session["user_id"]}" }, 
    :uuid 
] 
config.log_formatter = Logger::Formatter.new 

これは次のようにログを生成します。私は、レール4にこれらをやりました。

[77e593dc-c852-4102-a999-5c90ea0c9d66]は、このリクエストの一意のIDです。要求のライフサイクルを追跡するのに役立ちます。

HTH。

関連する問題