#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