Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为Rails中的所有日志消息预先提供用户ID_Ruby On Rails_Ruby_Session_Logging_Authlogic - Fatal编程技术网

Ruby on rails 为Rails中的所有日志消息预先提供用户ID

Ruby on rails 为Rails中的所有日志消息预先提供用户ID,ruby-on-rails,ruby,session,logging,authlogic,Ruby On Rails,Ruby,Session,Logging,Authlogic,为了帮助跟踪用户操作以进行调试,我们正在考虑将会话的登录用户ID预先添加到每个日志消息中(如果适用)。我们的堆栈由Rails和Authlogic组成。我尝试过几种不同的路线,但迄今为止没有一条是100%成功的 由于Authlogic不会在会话数据中以纯文本形式存储用户ID,因此我们必须等待它被初始化。只有在ApplicationController初始化并设置为活动的Authlogic控制器后,才会发生这种情况。因此,我们不能依赖config/application.rb中的代码。在我看来,唯一

为了帮助跟踪用户操作以进行调试,我们正在考虑将会话的登录用户ID预先添加到每个日志消息中(如果适用)。我们的堆栈由Rails和Authlogic组成。我尝试过几种不同的路线,但迄今为止没有一条是100%成功的

由于Authlogic不会在会话数据中以纯文本形式存储用户ID,因此我们必须等待它被初始化。只有在ApplicationController初始化并设置为活动的Authlogic控制器后,才会发生这种情况。因此,我们不能依赖
config/application.rb
中的代码。在我看来,唯一的解决办法是在以后更换记录器

我试图通过对logger子类化并覆盖
add()
方法来创建一个新的logger类:

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
class UserLogger
这似乎对伐木前哨站没有任何影响。我还尝试过使用标记日志,但这似乎不是一个好的解决方案,因为您必须在块中抛出任何标记代码

我还尝试在应用程序配置中定义
config.log_标记,方法是给它一个Proc,但Authlogic抛出了相同的
Authlogic::Session::Activation::NotActivatedError
异常。试图捕捉这个异常会使Ruby进入一个非常奇怪的状态,在某个地方似乎是一个无限循环,并将我的CPU固定在100%


是否有一个简单的解决方案,或者我完全缺少的解决方案?

我的项目也使用自定义记录器,我们将其连接到environments/production.rb中。是否在production.rb中设置Rails记录器

config.logger = ActiveSupport::TaggedLogging.new(UserLogger.new)

无法从
请求
对象访问
会话
对象。但您可以访问
cookies

因此,在用户登录后添加以下代码:

cookies.signed[:user_id] = @user.id
并添加一个初始值设定项,如:

MyApp::Application.config.log_tags = [
    -> request { "user-#{request.cookie_jar.signed[:user_id]}" }
]
现在,您的所有日志都将有
[user-980191314]
[user-]
前缀