如何在每条日志消息(Rails 3)中添加会话ID?

时间:2011-12-24 07:56:54

标签: ruby-on-rails-3 session logging

我的想法是捕获session_id并将其存储在线程本地存储中,例如

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

但是在调用过滤器之前会发生一些rails记录。

我以为我可以通过编写中间件插件来捕获session_id。但同样,我似乎没有及早得到所有日志记录。

我最早可以捕获session_id的是什么?

谢谢!

4 个答案:

答案 0 :(得分:5)

由于Rails 3.2支持使用log_tags配置数组进行标记日志记录,log_tags数组接受Proc对象,并且使用请求对象调用proc对象,我可以配置log_tags以下方式:

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

它正在使用Rails 3.2.3,ActiveRecord的会话存储正在使用中。

答案 1 :(得分:2)

好的,我终于明白了。

  1. 我早先在机架堆栈中移动了ActionDispatch::CookiesActionDispatch::Session::CookieStore。这似乎是安全的,并且是必要的,因为否则在会话初始化之前会发生一些日志记录。

  2. 我添加了自己的机架中间件组件,用于在线程本地存储中设置session_id

  3. 我覆盖rails记录器,并在session_id前面添加每条日志消息。

  4. 这对于能够分离和分析特定用户会话的所有日志非常有用。

    我有兴趣知道其他人是如何做到这一点的。

答案 2 :(得分:1)

对于使用ActiveSupport::TaggedLogging的Rails 3.2,如果您正在使用:cookie_store

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

注意:使用"_session_id"的{​​{1}}值更改:key

相关:https://stackoverflow.com/a/22487360/117382

答案 3 :(得分:1)

基于@Felix的回答。我在rails 4中完成了这些:

# 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

这会生成如下日志:

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(这是多租户应用)。

[77e593dc-c852-4102-a999-5c90ea0c9d66]是此请求的唯一ID。用于跟踪请求的生命周期。

HTH。