4

在 rails 3.2 之前,默认情况下会阻止这种情况。对于 rails 3.2,似乎没有明确的解决方案。在提交更改的评论中,Aaron 建议使用进程 pid 和/或请求 uuid 标记日志行,这不满足我们的运营人员。我已经看到了一些随机的解决方案,但目前还不清楚它们解决问题的效果如何。这似乎是每个人都会遇到的一个相当平庸的问题。其他人推荐什么解决方案?其他人是否只是依靠 NewRelic 来记录他们关心的数据?

亚伦的承诺

4

2 回答 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 回答