Як отримати друк 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.