我记得收到订单很好的日志文件,这样你就可以关注一个请求,然后关注下一个请求,依此类推。
现在,日志文件是,正如我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上运行的。
是的,他们已经做了一些改变 ActiveSupport::BufferedLogger
所以它不再等待请求结束以刷新日志:
但他们已经加入了 ::的ActiveSupport TaggedLogging 这很有趣,你可以 邮票 每个日志都有你想要的任何标记。
在你的情况下可能会很好 邮票 与日志 请求UUID 喜欢这个:
# config/application.rb
config.log_tags = [:uuid]
然后即使是日志 弄乱 你仍然可以按照哪一个对应你正在跟进的请求。
您可以使用此功能制作更多有趣的内容,以帮助您进行日志研究:
如果您重视生产日志的可读性,那么您可以使用
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)
那么,对我来说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
据我所知,这并没有影响我的应用程序,它仍在运行,现在我的日志再次有意义。
他们应该添加一些准随机的reqid,并在每一行中写一个单一的请求。这样你就不会感到困惑。
我没有用它,但我相信 伐木工人的 unit_of_work
方法 可能就是你要找的东西。你打电话:
Lumberjack.unit_of_work do
yield
end
并且在该块或在生成的块中完成的所有日志记录都标有唯一ID。