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 に答える