在 rails 3.2 之前,默认情况下会阻止这种情况。对于 rails 3.2,似乎没有明确的解决方案。在提交更改的评论中,Aaron 建议使用进程 pid 和/或请求 uuid 标记日志行,这不满足我们的运营人员。我已经看到了一些随机的解决方案,但目前还不清楚它们解决问题的效果如何。这似乎是每个人都会遇到的一个相当平庸的问题。其他人推荐什么解决方案?其他人是否只是依靠 NewRelic 来记录他们关心的数据?
问问题
585 次
2 回答
1
我们最终编写了一个稍微可怕的补丁来恢复旧的行为:
config.after_initialize do
# Reverse the deprecation of flush in BufferedLogger
module ActiveSupport
class BufferedLogger
def flush
@log_dest.flush
end
def respond_to?(method, include_private = false)
super
end
end
end
# Let the OS buffer the log
Rails.logger.instance_variable_get(:@logger).instance_variable_get(:@log_dest).sync = false
end
于 2012-07-10T21:09:16.767 回答
0
更多信息:https ://github.com/rails/rails/issues/5388
上面的答案没有在每个请求之后刷新日志行(Rails 3.2.18)。所以我使用了基于这篇文章的初始化程序:
class NonInterleavedLoggingMiddleware
def initialize(app, options = {})
@log = Rails.logger
.instance_variable_get(:@logger)
.instance_variable_get(:@log)
.instance_variable_get(:@logdev)
.instance_variable_get(:@dev)
@log.sync = false
@app = app
end
def call(env)
@app.call(env)
ensure
@log.flush # Rails.logger.flush has no effect / is deprecated
end
end
YourAppName::Application.config.middleware.insert_before(Rails::Rack::Logger, NonInterleavedLoggingMiddleware)
于 2014-05-22T12:57:03.030 回答