问题 Rails 3.2.2日志文件无序,请求交织在一起


我记得收到订单很好的日志文件,这样你就可以关注一个请求,然后关注下一个请求,依此类推。

现在,日志文件是,正如我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

这很令人发狂,因为我无法分辨出一个请求中发生了什么。

这是在Passenger上运行的。


10542
2017-07-19 13:24


起源

我认为是相关的 news.ycombinator.com/item?id=4483390 - fguillen


答案:


是的,他们已经做了一些改变 ActiveSupport::BufferedLogger 所以它不再等待请求结束以刷新日志:

但他们已经加入了 ::的ActiveSupport TaggedLogging 这很有趣,你可以 邮票 每个日志都有你想要的任何标记。

在你的情况下可能会很好 邮票 与日志 请求UUID 喜欢这个:

# config/application.rb
config.log_tags = [:uuid]

然后即使是日志 弄乱 你仍然可以按照哪一个对应你正在跟进的请求。

您可以使用此功能制作更多有趣的内容,以帮助您进行日志研究:


3
2018-01-10 17:00





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

如果您想了解有关此问题的更多信息,请参阅删除旧记录方式的提交 https://github.com/rails/rails/commit/04ef93dae6d9cec616973c1110a33894ad4ba6ed


4
2017-08-29 20:48





如果您重视生产日志的可读性,那么您可以使用

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)

4
2017-09-06 10:14



如果我没有弄错的话,如果您碰巧得到了之前进程的PID,那将覆盖旧的日志文件。这可以通过频繁旋转在某种程度上减轻,但由于PID不是你可以指望的东西,所以仍然不是100%安全。我想你想在日志文件名中添加一个时间戳或其他东西。另外:PassengerMaxInstancesPerApp的建议很无用,接近于snarky;我会从你的答案中删除它。 - David N. Welton
我贬低了这个答案,因为你永远不应该建议改变PassengerMaxInstancesPerApp。它类似于建议删除根目录的一行代码,如果有人问如何释放硬盘空间。请修改。 - trisweb
PassengerMaxInstancesPerApp部分是一个笑话,但如果你在开发过程中使用它,它也是一个真正的解决方案。 - Manfred Stienstra


那么,对我来说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

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


3
2018-02-01 12:10





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


0
2017-09-06 10:49





我没有用它,但我相信 伐木工人的 unit_of_work 方法 可能就是你要找的东西。你打电话:

Lumberjack.unit_of_work do
  yield
end

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


0
2018-05-29 21:03