ставить 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.