Как мне отключить ведение журнала для задачи rake?

#ruby-on-rails #ruby-on-rails-3 #rake

#ruby-on-rails #ruby-on-rails-3 #rake

Вопрос:

У меня есть задача rake, которая запускается как задание cron один раз в день. Он выполняет некоторое обслуживание модели, в которой в настоящее время содержится более 57 тысяч записей. Это добавляет сотни тысяч строк в журнал каждый раз, когда задача выполняется для любой среды, в которой она находится в данный момент. (В настоящее время это только в разработке.)

Как я могу отключить ведение журнала для конкретной задачи rake или группы задач, но оставить ведение журнала отдельно для остальной части приложения и оставить его отдельно для модели / методов, которые вызываются из задачи?

Ответ №1:

Rails logger является ActiveSupport::BufferedLogger объектом, но может быть переназначен любому другому типу Logger объекта (или любому объекту, который реагирует на Logger методы) по вашему желанию, включая что-то вроде этого:

 dev_null = Logger.new("/dev/null")
Rails.logger = dev_null
ActiveRecord::Base.logger = dev_null
  

Поместите эти строки в начало вашей задачи Rake, и все выходные данные журнала будут недорого отправлены в /dev/null , что лучше всего объясняется в его статье в Википедии.

Комментарии:

1. Даже с этой строкой в качестве первой строки в каждой из задач Rails добавляет строку в журнал для каждой загружаемой записи, например, Загрузка фотографий (34,0 мс) ВЫБЕРИТЕ image_id ИЗ photos WHERE ( photos .album_id = 16616519)

2. @Preacher: здесь я подумал, что Rails было бы достаточно умно предоставить одно местоположение для установки экземпляра logger для всего приложения. Какой я глупый. Обновил ответ лучшим решением.

3. Это сработало. Есть ли какой-нибудь шанс, что вы могли бы объяснить, что это делает?

4. @Preacher: Я думаю, что вопрос четко объясняет, что он делает сейчас. /dev /null — это местоположение, в которое можно записать, но на самом деле оно никуда не записывается, данные отбрасываются.

5. Использование «/dev /null» неэффективно (все еще форматирование и запись в файл). Logger.new(nil) работает нормально.

Ответ №2:

Вы можете добавить это в начало задачи:

 ActiveRecord::Base.logger.level = 2
  

Комментарии:

1. К вашему СВЕДЕНИЮ: молчание устарело и будет удалено из Rails 4.0

Ответ №3:

Если у вас есть задание cron, вы можете перенаправить вывод в /dev / null, например :

 * * * * * rake whatever_task_blah_blah > /dev/null 2>amp;1
  

Комментарии:

1. Я получаю тот же результат, что и в другом ответе.

2. Это привело бы к передаче выходных данных только в /dev / null, а не в вывод регистратора.

3. Согласен. Однако он не упоминает, что на самом деле хочет передать. Вот почему cron может быть возможностью.

Ответ №4:

другой возможностью было бы иметь конфигурацию, которая проверяет наличие env var

 # production.rb

Rails.application.configure do
  #...
  config.log_level = ENV["RAILS_LOG_LEVEL"].presence || :debug # default level

end
  

Затем вы можете запустить что угодно с префиксом нужного вам уровня

 $> RAILS_LOG_LEVEL=info bin/rake my:rake:task