有没有办法在Rails中为每个日志添加会话ID。
现在,我在环境中添加了这个.rb:
class Logger
def format_message(severity, timestamp, progname, msg)
"#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n"
end
end
首先,这是最好的做法吗?我如何添加会话ID?
答案 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(以及更多内容)。它是自动的,你不会失去可读性。