Ставит против логгера в рельсовых рейках

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Все, что необходимо сохранить для потомков ( "отправленное предупреждающее письмо на [email protected]" ), следует отправить в Rails.logger.

Ответ 4

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

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

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

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

(через)

Ответ 5

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

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

Затем вызовите output_debug вместо puts или logger.info

Ответ 6

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

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 Примечание. При большом количестве выходных данных регистрации можно быстро получить неаккуратное время.

Ответ 7

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

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

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

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

Ответ 8

Код

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

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

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/info/2246141/puts-vs-logger-in-rails-rake-tasks
    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.