Как записать / очистить журнал Rails, когда процесс умирает - PullRequest
4 голосов
/ 10 мая 2011

В логере Rails есть метод auto_flushing.Это задерживает запись в журнал до тех пор, пока количество записей не станет таким, как было установлено.Это происходило со времен Rails 2 и предназначено для ускорения процесса за счет остановки постоянной записи на диск под нагрузкой.

Это нормально в большинстве случаев, но у нас есть короткие выполняемые задания, которые никогда не задерживаются достаточно долгочтобы пройти очистку - все ошибки исчезают.

Есть ли способ гарантировать, что журнал очищается при завершении процесса?

EDIT

В конце концов я сделал это (но это очень многословно)

af = Rails.logger.auto_flushing
Rails.logger.auto_flushing = true
Rails.logger.error "my message"
Rails.logger.auto_flushing = af

Это вынуждает сообщение, но потом возвращает автоматическую очистку

Для действительно полного решения поместите это в инициализатор:

class << Rails.logger
  def flush_error( message )
    Rails.logger.error message
    Rails.logger.flush
  end
end

Тогда просто используйте метод как и когда ...

Ответы [ 4 ]

4 голосов
/ 27 июня 2012

Если по какой-то причине rails не запускает хук at_exit (летающие обезьяны скрываются от вашего здравомыслия), и вы действительно действительно хотите эти записи в журнале, сделайте, как сказали некоторые люди, и запустите этопосле важных операторов записи:

Rails.logger.flush

или

logger.flush

Вуаля.

3 голосов
/ 10 мая 2011

Не можете ли вы установить это значение на «1», и оно будет мигать после каждого сообщения?

config.logger.auto_flushing = 1

[ РЕДАКТИРОВАТЬ : как указывает madlep в комментарии выше - это будет полный скачок ресурсов и, вероятно, не лучший способ ведения журнала в целом. Но если вы охотитесь за ошибками - это способ найти это. Это и переключение вашего журнала на «уровень отладки»]

Вы также можете отключить его с помощью:

config.logger.auto_flushing = false

Но это просто означает, что вы должны вручную сбросить ...

в качестве альтернативы, вы можете специально очистить журнал в конце каждого из ваших скриптов с помощью:

Rails.logger.flush
2 голосов
/ 25 мая 2011

Попробуйте что-то вроде

Signal.trap("EXIT") { Rails.logger.flush }

Когда вы инициализируете запись в журнал, чтобы зарегистрировать обработчик сигнала в процессе.Когда он умирает, он выполняет все, что находится в блоке, прежде чем завершить

См. документы для получения дополнительной информации

(примечание - полностью непроверенный код с регистратором rails, ноработает в общем случае просто что-то делает , когда процесс умирает.

1 голос
/ 07 декабря 2011

Начиная с Rails 3.1, в этом больше нет необходимости: код в приложении Railties / bootstrap.rb теперь включает at_exit для очистки журнала.

Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...