2012-04-20 2 views
3

Сейчас только следующие записываются в logs/delayed_job.log:Есть delayed_job журнал «путы», SQL запросы и задания статуса

2012-04-20T03:57:44+0000: Cacher completed after 5.3676 
2012-04-20T03:57:44+0000: 1 jobs processed at 0.1744 j/s, 0 failed ... 

То, что я пытаюсь сделать, это иметь также регистрировать все мои puts а как и мои SQL-запросы, как это происходит в режиме разработки, за исключением того, что он все равно записывается в log/delayed_job.log.

Я пытался добавить не следующее initializers/delayed_job_config.rb но не повезло:

Delayed::Worker.logger = Rails.logger 
Delayed::Worker.logger.level = Logger::DEBUG 

(все мои puts нужно регистрироваться сейчас, но не более журналов статуса работы и до сих пор нет SQL запросов)

ответ

3

может быть, эта ссылка Вам полезны: https://stackoverflow.com/a/7223681/445908

ОБНОВЛЕНО: немного больше о путях. v.s logger:

Я не уверен, что ваша реализация создания результата «puts» хранится в файле журнала. однако я думаю, что это может быть намного лучший выбор для ALWAYS использовать «logger» вместо «puts». причины:

  1. в большинстве случаев, puts может замедлить производительность (особенно в производственной среде, во всех моих прошлых проектов, puts не разрешается появляться в исходном коде) (для Java программист, System.out.println тот же материал)

  2. всегда используют logger, так как он имеет уровень 5 по умолчанию: отлаживать, информация, предостерегают, ошибка, фатальные, которые могли бы быть контроль и красиво отформатирована и фильтруется инструментов, таких как grep. например может puts вывести информацию о журнале ниже?

    07:27:48 INFO: in device_resource, options: [email protected] 
    07:27:48 INFO: cloudset: ??100 
    
+0

Попробовали все 3 решения, и никто из них не работает. Во всех случаях «log/delayed_job.log» получает сообщения о статусе задания, а 'development.log' получает запросы sql, но нет, где мои« puts »будут видны. – samvermette

+0

так как вы делаете свои «ставит» в журнал? возможно, вы должны позволить delayed_job знать, как это работает. –

+0

так используйте что-то вроде 'logger.info' вместо этого? – samvermette

8

В Rails v3.2.13 вы можете сделать:

Delayed::Worker.logger = ActiveSupport::Logger.new("log/delayed_job.log", Rails.logger.level) 
Delayed::Worker.logger.auto_flushing = 1 

#only reassign AR logger if we're in a delayed process(rake task or script/delayed_job) 
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/) 
    ActiveRecord::Base.logger = Delayed::Worker.logger 
end 

Но ... ActiveSupport :: BufferedLogger является устаревшим https://github.com/rails/rails/blob/master/activesupport/lib/active_support/buffered_logger.rb#L18

Кроме того, вы, вероятно, хотите, чтобы повернуть правильно? Так что это лучше, я думаю:

Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600) 

if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/) 
    ActiveRecord::Base.logger = Delayed::Worker.logger 
end 

Конструктор говорит держать около 5 файлов журналов и вращаются, когда текущий файл журнала попадает 100Mb. Смотрите здесь для подробностей: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html#method-c-new

Кредит: http://www.heedspin.com/2011/01/17/delayed-job-logging.html для вдохновения

+0

где вы это положили? в инициализаторе? – Joelio

+0

обязательно, или файл окружения. –

2

Это может быть немного поздно для OP, но здесь другой подход: использовать DelayedJob плагин для установки Rails (и ActiveRecord :: Base) с тем, который назначен Работнику.

два шага: в вашем запаздывающей инициализаторе работы, сделать:

require 'delayed_job_log_setup' 
Delayed::Worker.plugins << DelayedJobLogSetup 

сам плагин (который я, очевидно, положить в Lib/delayed_job_log_setup.rb):

require 'delayed_job' 

class DelayedJobLogSetup < Delayed::Plugin 
    callbacks do |lifecycle| 
    lifecycle.before(:execute) do |worker| 
     Rails.logger = worker.logger 
     ActiveRecord::Base.logger = worker.logger 
    end 
    end 
end 

К сожалению, мои попытки monkey-patch Object#puts, чтобы вызвать логгер напрямую (внутри плагина), по-прежнему не выполняет то, что хотел OP.

+0

Отличный ответ. Это работает правильно для заданий, которые являются классами, а также заданиями, используя простой .delay. синтаксис. – dodgio

0

Другой способ сделать это - сделать необходимую конфигурацию файла журнала в файле script/delayed_job в вашем приложении rails. Шахта теперь выглядит следующим образом:

#!/usr/bin/env ruby 

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 
require 'delayed/command' 

# This was added to make sure the DJ log has the same log level 
# as the rails app, and to ensure ActiveRecord uses the same log 
# when loaded inside a DJ worker process. 
# 
Delayed::Worker.logger ||= Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'), Rails.configuration.log_level) 
ActiveRecord::Base.logger = Delayed::Worker.logger 

Delayed::Command.new(ARGV).daemonize 

Его довольно простой и понятный, что происходит с этим подходом.

И что еще более важно, нет риска испортить AR-регистратор для сценариев, которые не связаны с отложенным рабочим процессом. Это случилось с нами с другим подходом, похожим на некоторые другие ответы, и вызвало множество головных болей и путаницы.

+0

По какой-то причине, с Rails 3.2.16 под AWS Elastic Beanstalk on Passenger Standalone, это создало новый пустой пустой файл журнала, содержащий один SQL-запрос каждые пять секунд (каждый раз, когда демон запускается). Похоже, что он дошел до 100 файлов, прежде чем остановиться или, может быть, начать все заново. Кроме того, похоже, что параметр log_level не может быть установлен в методе «Logger.new». –

+0

@MarkBerry похоже, что у вас есть какой-то компонент вращения журнала, который работает за пределами этого кода? Я не знаком с AWS Elastic Beanstalk, поэтому не могу прокомментировать, что он может представить. –

+0

Я не думаю, что это связано с вращением журнала, поскольку повернутые журналы переходят в подкаталог. Это похоже на то, что было что-то, что заставило его создать новый файл (каждые пять секунд), а не перезаписать старый. Я думаю, что это связано с тем, что этот код в файле сценария, а не инициализатор. Вы используете этот код в производстве? Мне повезло вернуться к настройке журнала в инициализаторе. –

Смежные вопросы