ставить vs реєстратор в рейки завдання граблі


108

Якщо я використовую команду put, то я бачу вихід на консолі. Однак я не побачу це повідомлення у файлі журналу, коли додаток розгорнуто у виробництві.

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

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

Чи є спосіб досягти цього?

Відповіді:


57

Помістіть це application.rbабо в завдання граблі ініціалізуйте код

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

Це код Rails 3. Зауважте, що це буде замінити реєстрацію на development.log. Якщо ви хочете і те, STDOUTі інше, development.logвам знадобиться функція обгортки.

Якщо вам подобається така поведінка лише в консолі Rails, розмістіть у своєму блоці той самий блок коду ~/.irbrc.


26
Не було б простіше просто ввести Rails.logger = Logger.new(STDOUT)в development.rb?
гемптон

Для рейок 2 введіть це у свій development.rb:config.logger = Logger.new(STDOUT)
jsarma

38

Ви можете створити нове завдання граблі, щоб змусити це працювати.

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

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

rake to_stdout some_task

11

Завдання граблі виконує користувач у командному рядку. Все, що їм потрібно знати відразу ("оброблено 5 рядків"), повинно виводитися на термінал за допомогою puts.

Все, що потрібно зберігати для нащадків ("надіслане попередження електронною поштою jsmith@example.com"), слід надсилати на адресу Rails.logger.


17
Не рідкість виконувати завдання з граблями cron.
Йоханнес Горсет

2
Правда. Якщо ви хочете, щоб повідомлення журналу надсилалися вам електронною поштою, коли робота з cron завершиться, виплюньте їх на $ stdout або $ stderr.
Джонатан Джуліан

10

Я б сказав, що використання Rails.logger.info- це шлях.

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

Багатьом користувачам відомо команда UNIX® «хвіст», яка може бути використана для відображення останніх рядків великого файлу. Це може бути корисно для перегляду файлів журналів тощо.

Ще кориснішим в деяких ситуаціях є параметр '-f' для команди 'tail'. Це призводить до того, що хвіст "слідкує" за вихідним файлом. Спочатку відповідь буде такою ж, як і для 'хвоста' - відображатиметься останні кілька рядків файлу. Однак команда не повертається до підказки, а натомість продовжує «слідувати» за файлом. Коли в файл будуть додані додаткові рядки, вони будуть відображатися на терміналі. Це дуже корисно для перегляду файлів журналів або будь-якого іншого файлу, який може бути доданий з часом. Введіть "чоловічий хвіст", щоб отримати докладнішу інформацію про цей та інші варіанти хвоста.

( через )


Але це не дуже зручно під час роботи на локальній машині, оскільки ви не бачите вихід у тому ж вікні, де ви назвали завдання. Особливо, якщо у вас немає великого екрану, щоб розмістити кілька вікон поруч.
Томаш Маркаускас

10
Ще краще - використовувати tailf"Це схоже на хвіст -f, але не має доступу до файлу, коли він не росте" (з manpage). Це теж коротше
MBO

@tomas, чому б не мінімізувати консоль журналу сервера і мати лише одну консоль із запущеним хвостом? У будь-якому випадку це не реальна проблема ... Я бігаю, як 8 консолей, які відслідковують те, що відбувається в моєму додатку, просто перемикайтеся між вкладками, коли ви працюєте над певною частиною системи. Немає великого діла
marcgg

@mbo приємно :) halas не схоже, що це доступно на моїй машині (mac os @ leopard)
marcgg

1
@marcgg: У ​​мене немає "консолі сервера" (я використовую пасажирську), але питання стосується завдань граблі, і якщо ви запускаєте завдання з одного вікна терміналу, ви не бачите нічого з реєстратора в цьому вікні. Ви повинні мати ще одне вікно з development.log, щоб побачити вихід. В ідеалі я хотів би якось додати stdout як інший вихідний потік до Rails.logger, але не видаляти початковий.
Томаш Маркаускас

9

Код

Для Rails 4 та новіших версій ви можете використовувати трансляцію Logger .

Якщо ви хочете отримати STDOUT та журнал файлів для рейкових завдань у режимі розробки, ви можете додати цей код у config/environments/development.rb:

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/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.


У Rails 5 basename($0) == 'rake'фокус більше не працює, оскільки сама railsкоманда працює rake. Я хотів би знайти гарну заміну для нього поза межами залежно від завдання, яке ставить перед собою broadcast. (Ця частина, принаймні, все ще працює чудово.)
Брент Роял-Гордон

@ BrentRoyal-Gordon Немає потреби в цьому умовному розвитку, ви можете просто додати код Rakefileв корінь свого проекту
Mauricio Pasquier Juan

4

Як щодо створення помічника програми, який визначає, яке середовище працює і чи правильно робить?

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

Тоді виклик output_debug замість put або logger.info


5
Я не думаю, що це гарна ідея. Журнал Rails призначений для налаштування, але замість того, щоб використовувати цю конфігурацію, ви просто збираєте більше шарів поверх нього тут.
Сіджмен Малдер

Так, це не дуже добре, оскільки та сама перевірка проводитиметься кожного разу, коли ви хочете щось ввійти.
furiabhavesh

3

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

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

Щоб перенаправити реєстратор в контролери:

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

Я також знайшов цю статтю, дуже корисною sepcot.com/blog/2009/08/rails-logging-to-stdout
Tania R

2

Виконайте фонове завдання за допомогою "&" та відкрийте скрипт / консоль чи що завгодно. Таким чином ви можете запускати кілька команд в одному вікні.

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>]

Примітка Швидко можна отримати неохайність, коли є багато результатів ведення журналу.

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