Як отримати друк Rails.logger на консоль / stdout під час запуску rspec?


79

Те саме, що і назва: Як отримати Rails.loggerдрук на консоль / stdout під час запуску rspec? Напр.

Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"

Я все ще хочу Rails.loggerпіти log/test.logтеж.

Відповіді:


71

Для Rails 4 див. Цю відповідь.

Для Rails 3.x налаштуйте реєстратор config/environments/test.rb:

config.logger = Logger.new(STDOUT)
config.logger.level = Logger::ERROR

Це призведе до чергування будь-яких помилок, які реєструються під час тестування до STDOUT. Ви можете направити вихідні дані на STDERR або замість цього використовувати інший рівень журналу.

Надсилання цих повідомлень як на консоль, так і у файл журналу вимагає чогось більш надійного, ніж вбудований клас Logger в Ruby . Каротаж камінь буде робити те , що ви хочете. Додайте його до свого Gemfile, а потім встановіть два додатки в config/environments/test.rb:

logger = Logging.logger['test']
logger.add_appenders(
    Logging.appenders.stdout,
    Logging.appenders.file('example.log')
)
logger.level = :info
config.logger = logger

Для рейок 4.2.1, я повинен був встановити рівень журналу в конфігурації, як це переписується в bootstrap.rbна екземплярі реєстратора: github.com/rails/rails/blob/v4.2.4/railties/lib/rails / ... рівень журналу був встановлений config.log_level = :ERROR
Thomas B Homburg

@tommes чи можете ви опублікувати іншу відповідь із точною назвою файлу та кодом, який ви додали? Я зміню свою відповідь, щоб вказати, що це для Rails 3.x.
Філ Кальвін,

1
Якщо вам просто потрібен вихід журналу для певного тестового класу, ви можете ввести config.logger = Logger.new(STDOUT)свій setupметод. Якщо вам просто потрібні результати реєстратора для конкретного тесту, поставте config.logger = Logger.new(STDOUT)на початку тесту. Це працює принаймні для MiniTest on Rails 5.0.1.
Ленчо Рейес,

Я думаю, що слід використовувати ActiveSupport::Loggerзамість просто Logger. Я просто зламав виробництво, тому що я очікував, Rails.loggerщо буду об’єктом з ActiveSupport::Loggerінтерфейсом, і в dev & test вони є ...
kaikuchn,

Придивившись уважніше, Rails.loggerвиявляється, що це насправді ActiveSupport::Loggerобгорнуте ActiveSupport::TaggedLogging.new..
kaikuchn

75

Для Rails 4.x рівень журналу налаштований дещо інакше, ніж у Rails 3.x

Додайте це до config/environment/test.rb

# Enable stdout logger
config.logger = Logger.new(STDOUT)

# Set log level
config.log_level = :ERROR

Рівень реєстратора встановлюється в екземплярі реєстратора за config.log_levelадресою: https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

Змінна середовища

Як бонус ви можете дозволити перезапис рівня журналу, використовуючи змінну середовища зі значенням за замовчуванням, наприклад:

# default :ERROR
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")

А потім запустіть тести з оболонки:

# Log level :INFO (the value is uppercased in bootstrap.rb)
$ LOG_LEVEL=info rake test

# Log level :ERROR
$ rake test

Я прагнув швидко налаштувати рівень із середовища. Я бачу, що це можна зробити вручну, але я вважаю, що в рамках реєстрації Rails немає вбудованого механізму для цього?
Pysis

Я також знайшов цей дорогоцінний камінь: github.com/dominicsayers/loglevel Він виглядає так, ніби створить ще один реєстратор, тому не впевнений, чи буде він інтегрований чисто.
Pysis


21

Рішення, яке мені подобається, оскільки він зберігає вивід rspec окремо від фактичного виходу журналу рейок, полягає у виконанні наступного:

  • Відкрийте друге вікно терміналу або вкладку та розташуйте його так, щоб ви могли бачити як основний термінал, на якому запущено rspec, так і новий.
  • Запустіть команду tail у другому вікні, щоб ви бачили, як рейки реєструються в тестовому середовищі. За замовчуванням це може бути , як $ tail -f $RAILS_APP_DIR/logs/test.logі tail -f $RAILS_APP_DIR\logs\test.logдля користувачів Window
  • Запустіть свої набори rspec

Якщо у вас запущений багатопанельний термінал, такий як iTerm, це стає ще цікавішим, і ви маєте, rspecі test.logвихідні дані поруч.


7

Ви можете визначити метод в spec_helper.rb, який надсилає повідомлення як Rails.logger.info, так і ставить і використовує його для налагодження:

def log_test(message)
    Rails.logger.info(message)
    puts message
end

1
я сподівався на щось зовнішнє щодо виклику Rails.logger.info, оскільки я використовую Rails.logger.info, Rails.logger.debug тощо у своєму виробничому коді. дякую за відповідь.
s12chung

Розумію. Але чому це заважає вам використовувати Rails.logger у своїх тестах?
manglewood

Я також використовую його в своїх тестах. Було б просто непогано, щоб все друкувалось у stdout, замість того, щоб використовувати хвіст.
s12chung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.