我的想法是捕获session_id并将其存储在线程本地存储中,例如
Thread.current[:session_id] = session[:session_id]
但是在调用过滤器之前会发生一些rails记录。
我以为我可以通过编写中间件插件来捕获session_id。但同样,我似乎没有及早得到所有日志记录。
我最早可以捕获session_id的是什么?
谢谢!
答案 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)
好的,我终于明白了。
我早先在机架堆栈中移动了ActionDispatch::Cookies
和ActionDispatch::Session::CookieStore
。这似乎是安全的,并且是必要的,因为否则在会话初始化之前会发生一些日志记录。
我添加了自己的机架中间件组件,用于在线程本地存储中设置session_id
。
我覆盖rails记录器,并在session_id
前面添加每条日志消息。
这对于能够分离和分析特定用户会话的所有日志非常有用。
我有兴趣知道其他人是如何做到这一点的。
答案 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 :(得分: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。