为了帮助跟踪用户操作以进行调试,我们正在考虑将会话的登录用户 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,但这似乎不是一个好的解决方案,因为您必须将任何标记代码放入一个块中。
我还尝试config.log_tags
通过给它一个 Proc 在应用程序配置中进行定义,但 Authlogic 抛出了相同的Authlogic::Session::Activation::NotActivatedError
异常。试图捕捉这个异常会使 Ruby 进入一个非常奇怪的状态,在某处似乎是一个无限循环,并将我的 CPU 固定在 100%。
是否有一个简单的解决方案或我完全失踪的一个?