为了帮助跟踪用户操作以进行调试,我们正在考虑将会话的登录用户ID添加到每个日志消息(如果适用)。我们的堆栈由Rails和Authlogic组成。我尝试过几条不同的路线,但到目前为止还没有100%成功。
由于Authlogic不在会话数据中以纯文本形式存储用户ID,因此我们必须等待它被初始化。只有在ApplicationController初始化并设置为活动的Authlogic控制器之后才会发生这种情况。因此,我们无法依赖config/application.rb
中的代码。在我看来,唯一的解决方案是稍后更换记录器。
我尝试通过继承Logger并覆盖add()
方法来创建一个新的记录器类:
class UserLogger < Logger
def add(severity, message = nil, progname = nil, &block)
begin
session = UserSession.find
rescue
return super(severity, message, progname, &block)
end
user = session.user if session
if block_given? || !user
return super(severity, message, progname, &block)
end
unless message.nil?
message = "[#{user.id}] " + message
end
super severity, message, progname, &block
end
end
这似乎对原木前哨没有任何影响。我也尝试过使用TaggedLogging,但这似乎不是一个好的解决方案,因为你必须在块中抛出任何标记的代码。
我还尝试通过给它一个Proc来定义应用程序配置中的config.log_tags
,但是Authlogic抛出了相同的Authlogic::Session::Activation::NotActivatedError
异常。尝试捕获此异常会使Ruby进入一个非常奇怪的状态,这似乎是一个无限循环,并将我的CPU固定在100%。
是否有一个简单的解决方案或一个我完全失踪?
答案 0 :(得分:3)
无法从session
对象访问request
对象。但您可以访问cookies
。
因此,请在用户登录后添加此代码:
cookies.signed[:user_id] = @user.id
添加初始化程序,如:
MyApp::Application.config.log_tags = [
-> request { "user-#{request.cookie_jar.signed[:user_id]}" }
]
现在,您的所有日志都会以[user-980191314]
或[user-]
为前缀。
答案 1 :(得分:1)
我的项目也在使用自定义记录器,我们将它连接到environment / production.rb中。您是否在生产中设置Rails记录器?rb?
config.logger = ActiveSupport::TaggedLogging.new(UserLogger.new)