Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 在Rails 4应用程序中,Log4r实际上是线程安全的吗? 布景_Ruby_Multithreading_Ruby On Rails 4_Passenger_Log4r - Fatal编程技术网

Ruby 在Rails 4应用程序中,Log4r实际上是线程安全的吗? 布景

Ruby 在Rails 4应用程序中,Log4r实际上是线程安全的吗? 布景,ruby,multithreading,ruby-on-rails-4,passenger,log4r,Ruby,Multithreading,Ruby On Rails 4,Passenger,Log4r,为了使默认的Rails日志记录在生产环境中更有帮助,我一直在利用Log4r及其诊断上下文,特别是。除了来自Rails应用程序本身的日志之外,我还插入了一些我自己的中间件,以便能够获得一致的日志,即使是在机架中间件中 例如,一旦我通过Warden访问登录用户,我就添加该条目所需的MDC条目 def call(env) user = env['warden'].user user_context = user ? user.to_log_format : 'indetermined' M

为了使默认的Rails日志记录在生产环境中更有帮助,我一直在利用Log4r及其诊断上下文,特别是。除了来自Rails应用程序本身的日志之外,我还插入了一些我自己的中间件,以便能够获得一致的日志,即使是在机架中间件中

例如,一旦我通过Warden访问登录用户,我就添加该条目所需的MDC条目

def call(env)
  user = env['warden'].user
  user_context = user ? user.to_log_format : 'indetermined'
  MDC.put :user, user_context

  @app.call(env)
end
机架中间件中记录的其他内容包括父PID、请求ID等

问题 问题是我的日志条目明显不正确。在负载下,我始终看到一个用户的身份与一个请求混合在一起,如果请求足够接近,则完全不同的用户会向API发出请求

我被告知这一点,但显然有些事情不对。我还想知道机架是否是问题所在,但Rails中的线程安全性——完全是一个词,对吧?——似乎足够自信,那么这似乎也不正确

我错过了什么?所有的信息似乎都说它是线程安全的,但我不相信它是

幕后
  • 轨道4.1.10
  • Log4r 1.1.10
  • 乘客4.0.59
工具书类

经过一些研究和实验,这根本不是螺纹安全性的问题;这是一个来自另一个请求的过时数据的问题。要了解问题,您必须了解Log4r MDC是如何存储的,以了解问题是什么:

MDC片段与线程一起存储,以便在整个请求过程中可以访问它们以进行日志记录

def self.put( a_key, a_value )
  self.check_thread_instance()
  Thread.current[MDCNAME][a_key] = a_value
end
因此,当一个线程完全处理完一个请求时,它将接收另一个请求。不幸的是,它似乎仍然携带来自上一个请求的详细信息-没有任何内容被清除。因此,所有这些旧的、不相关的细节可能最终成为一个不相关请求的诊断上下文

然后,解决方案是确保在开始向新请求添加新上下文之前清除MDC片段:

MDC.get_context.keys.each { |k| MDC.remove(k) }
哎呀