ставит vs logger в задачи rake rake - PullRequest
104 голосов
/ 11 февраля 2010

В задаче rake, если я использую команду put, я вижу вывод на консоли. Однако я не увижу это сообщение в файле журнала при развертывании приложения в рабочей среде.

Однако, если я скажу Rails.logger.info, то в режиме разработки я ничего не вижу на консоли. Мне нужно зайти в лог-файл и сделать это.

В идеале я бы хотел использовать Rails.logger.info, а в режиме разработки внутри задачи rake вывод из логгера также должен быть отправлен на консоль.

Есть ли способ достичь этого?

Ответы [ 8 ]

53 голосов
/ 01 декабря 2010

Поместите это в application.rb или в коде инициализации задачи rake

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

Это код Rails 3. Обратите внимание, что это переопределит ведение журнала на development.log. Если вам нужны STDOUT и development.log, вам понадобится функция-обертка.

Если вы хотите использовать это поведение только в консоли Rails, поместите тот же блок кода в ваш ~/.irbrc.

30 голосов
/ 30 ноября 2012

Вы можете создать новое задание на рейк, чтобы заставить его работать.

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

Таким образом, когда вы выполняете задачу rake, вы можете сначала добавить to_stdout, чтобы получать сообщения журнала stdout, или не включать его, чтобы сообщения отправлялись в файл журнала по умолчанию

rake to_stdout some_task
11 голосов
/ 11 февраля 2010

Rake-задачи запускаются пользователем из командной строки. Все, что им нужно знать сразу («обработано 5 строк»), должно выводиться на терминал с puts.

Все, что необходимо сохранить для потомков («отправлено предупреждение по адресу jsmith@example.com»), должно быть отправлено на Rails.logger.

10 голосов
/ 11 февраля 2010

Я бы сказал, что использование Rails.logger.info - это путь.

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

Многие пользователи знают о UNIX® команда 'tail', которую можно использовать для отобразить последние несколько строк большого файл. Это может быть полезно для просмотра файлы журналов и т. д.

Еще полезнее в некоторых ситуациях, является параметром '-f' для 'tail' команда. Это заставляет хвост «следовать» вывод файла. Первоначально ответ будет таким же, как для «хвост» сам по себе - последние несколько строк файла будет отображаться. Однако команда не возвращает на приглашение и вместо этого продолжает «следить» за файлом. Когда дополнительный строки добавляются в файл, они будут будет отображаться на терминале. Это очень полезно для просмотра файлов журнала или любой другой файл, который может быть добавлен через некоторое время. Наберите «мужской хвост» для более подробности об этом и другом хвосте опции.

( с помощью )

8 голосов
/ 21 ноября 2016

Код

Для Rails 4 и новее вы можете использовать Logger broadcast .

Если вы хотите получить как STDOUT, так и протоколирование файлов для задач rake в режиме разработки, вы можете добавить этот код в config/environments/development.rb:

  if File.basename($0) == 'rake'
    # /1822530/stavit-vs-logger-v-zadachi-rake-rake
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

Тест

Вот небольшая задача Rake для проверки кода выше:

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

Работает rake stdout_and_log:test Вывод

HELLO FROM PUTS
HELLO FROM LOGGER

, а

HELLO FROM LOGGER

был добавлен к log/development.log.

Работает rake stdout_and_log:test RAILS_ENV=production Вывод

HELLO FROM PUTS

, а

HELLO FROM LOGGER

был добавлен к log/production.log.

4 голосов
/ 12 февраля 2010

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

3 голосов
/ 22 ноября 2012

В Rails 2.X для перенаправления регистратора на STDOUT в моделях:

ActiveRecord::Base.logger = Logger.new(STDOUT)

Чтобы перенаправить регистратор в контроллеры:

ActionController::Base.logger = Logger.new(STDOUT)
2 голосов
/ 10 марта 2011

Выполнить фоновое задание с '&' и открыть скрипт / консоль или что-то еще .. Таким образом, вы можете запустить несколько команд в одном окне.

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

note Может быстро работать неаккуратно, когда много выходных данных журнала.

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