Ruby on rails 3 向每个登录Rails添加会话id

Ruby on rails 3 向每个登录Rails添加会话id,ruby-on-rails-3,Ruby On Rails 3,是否有方法将会话id添加到每个登录Rails 现在,我在我的environment.rb中添加了以下内容: class Logger def format_message(severity, timestamp, progname, msg) "#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n" end end 首先,这是最佳实践吗?如何添加会话id?使用rails 3.2时,可以使用日志标记: 更新Rails::R

是否有方法将会话id添加到每个登录Rails

现在,我在我的environment.rb中添加了以下内容:

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

首先,这是最佳实践吗?如何添加会话id?

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

更新Rails::Rack::Logger中间件以应用在 config.log_标记到新的ActiveSupport::TaggedLogging Rails.logger。这使得使用debug标记日志行变得很容易 子域和请求id之类的信息——这两种信息在 调试多用户生产应用程序DHH

幸运的是,将此添加到您的环境中可能会奏效:

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

对于不幸的人来说,答案来自@shigeya

不幸的是,rails没有提供一种以正常方式访问sessionid的方法。 您必须始终依赖rack在其内部所做的工作。。。使用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)

不幸的是,由于机架中间件中没有会话id,因此将会话id提供给日志标签(截至2012年5月23日)还不起作用

由于log_标记数组接受Proc对象,并且Proc对象由请求对象调用,因此我可以按照以下方式配置log_标记:

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

它与Rails 3.2.3配合使用,ActiveRecord的会话存储正在使用。

对于Rails 3.2配合
ActiveSupport::TaggedLogging
,如果您使用的是
:cookie\u store

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

注意:在
config/initializers/session\u store.rb

中使用
:key
值更改
“\u session\u id”
,不幸的是,使用Rails日志标记并不容易。而且,它会把你的日志弄得乱七八糟,以至于无法阅读


我推荐这样的东西,它通过简单地用元数据扩充日志来捕获会话ID(以及更多)。它是自动的,并且不会丢失可读性。

请注意,“\u session\u id”可能会在您的config/initializers/session\u store.rb中设置为其他内容。此解决方案不起作用。取决于你的“运气”值。我想你可以用猴子修补请求对象来让它工作,但shigeya的解决方案确实有效。具体来说,此处传递的任何符号都将是在请求对象上调用的方法。应该注意的是,这不会为您提供请求的会话id。它实际上正在读取整个Base64编码的cookie。因此,您会发现绝大多数用户都有“BAh7C0kiD3Nlc3Np”,因为这是Base64编码的前16个字符:{I“session_id”。@DrewBlas这无关紧要。这段信息足以跟踪用户的请求,并且在用户有新会话之前不会更改。在Rails4上,在开发过程中,每个请求的值都不同。我认为这可能已经更改,因为Cookie的值现在默认是加密的