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