在Rails中为每个日志添加会话ID

时间:2012-03-06 10:52:32

标签: ruby-on-rails-3

有没有办法在Rails中为每个日志添加会话ID。

现在,我在环境中添加了这个.rb:

class Logger
  def format_message(severity, timestamp, progname, msg)
    "#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n" 
  end 
end

首先,这是最好的做法吗?我如何添加会话ID?

4 个答案:

答案 0 :(得分:6)

不幸的是,将:session_id提供给log_tags还不起作用(截至2012年5月23日),因为Rack中间件中没有session_id。

由于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 :(得分:3)

当您使用rails 3.2时,您可以使用日志标记:

  

更新Rails :: Rack :: Logger中间件以应用设置的任何标签   config.log_tags到新的ActiveSupport :: TaggedLogging   Rails.logger。这样可以通过调试轻松标记日志行   子域名和请求ID等信息 - 非常有用   调试多用户生产应用程序DHH

运气好的话,将其添加到您的环境可能会有效:

config.log_tags = [:uuid, :remote_ip, :session_id]

更新

对于不幸的人来说,解决方案来自@shigeya的答案。

不幸的是,rails并没有提供一种以理智的方式访问你的sessionid的方法。 你总是要依赖机架正在做的内部工作......用你的cookie密钥访问cookie_jar是“推荐”的方式。

这是我用于我的应用程序:

config.log_tags = [
  :host,
  :remote_ip,
  lambda { |request| "#{request.uuid}"[0..15] },
  lambda { |request| "#{request.cookie_jar["_session_id"]}"[0..15] },
]

输出看起来像这样:

[hamburg.onruby.dev] [127.0.0.1] [27666d0897c88b32] [BAh7B0kiD3Nlc3Np] Completed 200 OK in 298ms (Views: 286.2ms | ActiveRecord: 9.2ms)

答案 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

答案 3 :(得分:0)

不幸的是,使用Rails日志标记并不容易。此外,它会使您的日志混乱到不可读的程度。

我推荐类似timber的内容,它只需使用元数据扩充日志即可捕获会话ID(以及更多内容)。它是自动的,你不会失去可读性。