Как сделать так, чтобы каждый рабочий единорога моего приложения на Rails записывал в отдельный файл? - PullRequest
9 голосов
/ 05 апреля 2011

Как я могу заставить каждого работника единорога моего приложения Rails писать в отдельный файл журнала?

Почему: проблема смешанных файлов журнала ... В конфигурации по умолчанию Rails будет записывать свои сообщения журналаодин файл журнала: log/<environment>.log.

Работники Unicorn будут одновременно записывать в один и тот же файл журнала, сообщения могут быть перепутаны.Это проблема, когда request-log-analyzer анализирует файл журнала.Пример:

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

В этом примере какое действие было выполнено за 100 мс, а какое - за 567 мс?Мы никогда не можем быть уверены.

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

добавить этот код в after_fork в unicorn.rb:

#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
2 голосов
/ 26 сентября 2013

@ ответ 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
...