Ruby on rails 3 Rails 3.2.2日志文件无序,请求相互交织
我记得得到的日志文件排列得很好,这样您就可以按照一个请求,然后是下一个请求,依此类推 现在,正如我4岁的孩子所说,日志文件是“全部拼凑起来的”,这意味着它们不再是单独的、不同的文本块。来自两个请求的日志相互交织/混淆 例如: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
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
中做了一些更改,因此不再等待请求结束后刷新日志:
# config/application.rb
config.log_tags = [:uuid]
然后,即使日志被弄乱了,您仍然可以跟踪哪个日志对应于您正在跟踪的请求
您可以使用此功能制作更多有趣的东西,以帮助您学习日志:
# 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部分是一个笑话,但如果您在开发过程中使用它,它也是一个真正的解决方案。我认为它是相关的