Ставит против логгера в рельсовых рейках
В 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
.