9

Rails アプリケーションの各ユニコーン ワーカーを別のログ ファイルに書き込むにはどうすればよいですか?

その理由: 混合ログ ファイルの問題... デフォルトの設定では、Rails はログ メッセージを単一のログ ファイルに書き込みます: log/<environment>.log.

Unicorn ワーカーは一度に同じログ ファイルに書き込むため、メッセージが混同される可能性があります。これは、request-log-analyzer がログ ファイルを解析するときに問題になります。例:

Processing Controller1#action1 ...
Processing Controller2#action2 ...
Completed in 100ms...
Completed in 567ms...

この例では、100 ミリ秒で完了したアクションと 567 ミリ秒で完了したアクションは? 確信が持てません。

4

2 に答える 2

3

このコードを unicorn.rb の after_fork に追加します。

#one log per unicorn worker
if log = Rails.logger.instance_values['log']
  ext = File.extname log.path
  new_path =log.path.gsub %r{(.*)(#{Regexp.escape ext})}, "\\1.#{worker.nr}\\2"
  Rails.logger.instance_eval do
    @log.close
    @log= open_log new_path, 'a+'
  end
end
于 2011-10-16T07:20:47.293 に答える
2

@slactの答えはRails 3では機能しません。これは機能します:

after_fork do |server, worker|

  # Override the default logger to use a separate log for each Unicorn worker.
  # https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/application/bootstrap.rb#L23-L49
  Rails.logger = ActiveRecord::Base.logger = ActionController::Base.logger = begin
    path = Rails.configuration.paths["log"].first
    f = File.open(path.sub(".log", "-#{worker.nr}.log"), "a")
    f.binmode
    f.sync = true
    logger = ActiveSupport::TaggedLogging.new(ActiveSupport::BufferedLogger.new(f))
    logger.level = ActiveSupport::BufferedLogger.const_get(Rails.configuration.log_level.to_s.upcase)
    logger
  end
end
于 2013-09-25T20:08:21.403 に答える