Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 3 Rails 3.2.2日志文件无序,请求相互交织_Ruby On Rails 3_Logging - Fatal编程技术网

Ruby on rails 3 Rails 3.2.2日志文件无序,请求相互交织

Ruby on rails 3 Rails 3.2.2日志文件无序,请求相互交织,ruby-on-rails-3,logging,Ruby On Rails 3,Logging,我记得得到的日志文件排列得很好,这样您就可以按照一个请求,然后是下一个请求,依此类推 现在,正如我4岁的孩子所说,日志文件是“全部拼凑起来的”,这意味着它们不再是单独的、不同的文本块。来自两个请求的日志相互交织/混淆 例如: Started GET /foobar ... Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.8ms) Patient Load (wait, that's from another request that

我记得得到的日志文件排列得很好,这样您就可以按照一个请求,然后是下一个请求,依此类推

现在,正如我4岁的孩子所说,日志文件是“全部拼凑起来的”,这意味着它们不再是单独的、不同的文本块。来自两个请求的日志相互交织/混淆

例如:

Started GET /foobar
...
Completed 200 OK in 2ms (Views: 0.4ms | ActiveRecord: 0.8ms)
Patient Load (wait, that's from another request that has nothing to do with foobar!)
[ blank space ]
Something else
这真让人恼火,因为我无法在一个请求中说出发生了什么


这是在乘客身上运行的。

我试图搜索相同的答案,但找不到任何好的信息。我不确定您是否应该修复服务器或rails代码


如果您想了解有关此问题的更多信息,这里是“提交”,它删除了旧的日志记录方式

如果您重视生产日志的可读性,而不是其他一切,则可以使用

PassengerMaxInstancesPerApp 1
配置。这可能会导致一些缩放问题。或者,您可以在application.rb中填充类似的内容:

process_log_filename = Rails.root + "log/#{Rails.env}-#{Process.pid}.log"
log_file = File.open(process_log_filename, 'a')
Rails.logger = ActiveSupport::BufferedLogger.new(log_file)

他们应该添加一些准随机的reqid,并将其写入关于单个请求的每一行。这样你就不会感到困惑了。

是的!,他们在
ActiveSupport::BufferedLogger
中做了一些更改,因此不再等待请求结束后刷新日志:

但是他们添加了一个非常有趣的标记,你可以在每一根日志上打上任何你想要的标记

在您的情况下,最好在日志上标记请求UUID,如下所示:

# config/application.rb
config.log_tags = [:uuid]
然后,即使日志被弄乱了,您仍然可以跟踪哪个日志对应于您正在跟踪的请求

您可以使用此功能制作更多有趣的东西,以帮助您学习日志:


对我来说,TaggedLogging解决方案是不可行的,如果服务器严重崩溃,我可以忍受一些日志丢失的情况,但我希望我的日志井然有序。因此,我将以下建议应用于我的应用程序:

# lib/sequential_logs.rb
module ActiveSupport
  class BufferedLogger
    def flush
      @log_dest.flush
    end
    def respond_to?(method, include_private = false)
      super
    end
  end
end

# config/initializers/sequential_logs.rb
require 'sequential_logs.rb'

Rails.logger.instance_variable_get(:@logger).instance_variable_get(:@log_dest).sync = false

据我所知,这并没有影响我的应用程序,它仍在运行,现在我的日志又有了意义。

我还没有用过它,但我相信这可能就是你想要的。你打电话:

Lumberjack.unit_of_work do
  yield
end

并且在该块中或在生成的块中完成的所有日志都用唯一的ID进行标记。

如果我没有弄错,如果您碰巧获得了上一个进程的PID,则会覆盖旧的日志文件。这可以通过频繁的旋转在一定程度上缓解,但由于PID不是您可以依赖的东西,所以仍然不是100%安全的。我想您应该在日志文件名中添加时间戳或其他内容。另外:PassengerMaxInstancesPerApp的建议是非常无用的,近乎于咆哮;我会从你的答案中删除它。我对这个答案投了反对票,因为你不应该建议改变PassengerMaxInstancesPerApp。这类似于建议在有人询问如何释放硬盘空间时删除根目录的一行代码。请修改。PassengerMaxInstancesPerApp部分是一个笑话,但如果您在开发过程中使用它,它也是一个真正的解决方案。我认为它是相关的