Как сохранить сообщения журнала вне STDOUT при выполнении задач Rake на Heroku? - PullRequest
3 голосов
/ 12 августа 2011

У меня есть некоторые задачи Rake, которые выдают CSV-вывод, который я хотел бы перенаправить в файл и открыть с помощью других инструментов, но когда я запускаю heroku rake foo > foo.csv, я получаю сообщения журнала (запросы SQL и т. Д.) В своем выводе.

Я пробовал Rails.logger = Logger.new('/dev/null') и Rails.logger = Logger.new(STDERR) в верхней части задачи Rake, и, хотя они работают, как и ожидалось, локально, они не оказывают заметного эффекта, когда я запускаю задачу в Heroku.

Я не слишком шокирован тем, что Heroku раздавит STDOUT и STDERR вместе, но для меня загадка, почему отправка в / dev / null не уничтожит вывод.

Любая помощь очень ценится.

Rails v3.0.0, стек Heroku bamboo-ree-1.8.7, рейк 0.9.2.

Ответы [ 5 ]

2 голосов
/ 29 сентября 2011

У меня была такая же проблема, хотя я не сталкивался с ней, пока не изменил config/environments/production.rb, чтобы получить это:

  config.logger = Logger.new(STDOUT)

(Я сделал это, чтобы мое приложение регистрировалось в журнале heroku.)

Мое исправление было таким:

config.logger = Logger.new(STDOUT) unless 'rake' == File.basename($0)
1 голос
/ 25 января 2013

Я столкнулся с той же проблемой и обнаружил, что более удобный обходной путь:

Добавить следующее к config/environments/production.rb

config.logger.level = Logger.const_get(ENV['LOG_LEVEL'] ? ENV['LOG_LEVEL'].upcase : 'INFO')

Нажмите на Heroku, затем, когда вы запускаете грабли, добавьте LOG_LEVEL="fatal" в конец команды (замените foo и foo.csv вашими вещами):

heroku run rake foo LOG_LEVEL="fatal" > foo.csv

В приведенном выше примере log_level установлено на fatal, но может быть любым из следующих: debug|info|warn|error|fatal. В нашем случае использование наивысшего значения ничего бы не значило, но самые фатальные ошибки выводятся в файл csv.

1 голос
/ 12 августа 2011

От Heroku |Центр разработки |Ведение журнала :

При нажатии на приложение Rails мы автоматически установим плагин rails_log_stdout в приложение, которое будет перенаправлять журналы на stdout.

Я думаю, что Heroku включает (в вывод, отправленный с помощью вашей команды git push) уведомление об этом (и еще одно дополнение: для обслуживания статического / public содержимого, если я правильно помню).Вы можете видеть только уведомления для определенных видов толчков (полные перестройки слагов?).Я помню, как видел это, когда недавно помещал новое приложение в стек Bamboo / MRI-1.9.2, но я не думаю, что получал сообщение каждый раз, когда помещал изменения только в код приложения (возможно, добавляя новый гем в Gemfileдостаточно для его запуска?).


Несколько подсистем Rails сохраняют свою собственную привязку logger (независимые привязки, значения которых часто инициализируются с Rails.logger; переназначение последних не меняет первое):

Изменения Heroku, вероятно, установили новое значение для Rails.logger до инициализации ActiveRecord.Когда ActiveRecord в конце концов загружается, он устанавливает собственный logger таким же, как Rails.logger (Heroku / stdout).Когда ваша задача выполняется, она переназначает Rails.logger, но уже слишком поздно, чтобы это оказало какое-либо влияние на ActiveRecord::Base.logger (единственное, что наиболее вероятно будет обрабатывать журналы SQL).

Возможно, вам придется переназначитьнекоторые из этих logger привязок, чтобы подавить лесозаготовку, идущую в STDOUT.Некоторые другие вероятные местоположения перечислены в разделе rails_log_stdout init.rb в разделе Rails 2.

0 голосов
/ 25 апреля 2017

Я решил эту проблему со следующим изменением в production.rb:

if 'rake' == File.basename($0)
  ActiveRecord::Base.logger = Logger.new('rake.log', 'daily')
end

Полагаю, мы могли бы также проигнорировать вывод

if 'rake' == File.basename($0)
  ActiveRecord::Base.logger = Logger.new('/dev/null')
end
0 голосов
/ 21 июня 2013

Просто чтобы помочь кому-нибудь с «новым» Rails-проектом, продвигающим Heroku:

Вам нужна комбинация @Matt Burke и ответа @ Hengjie:

Добавьте эти две строки в config / environment / production.rb :

config.logger = Logger.new(STDOUT)
config.logger.level = Logger.const_get(ENV['LOG_LEVEL'] ? ENV['LOG_LEVEL'].upcase : 'INFO')

Это настроит новый регистратор STDOUT и позволит вам легко контролировать разрешение журнала с помощью переменной среды LOG_LEVEL.

...