delayed_job не регистрируется

Я не могу регистрировать сообщения из моего процесса delayed_job. Вот работа, которая выполняется.

class MyJob
  def initialize(blahblah)
    @blahblah = blahblah
    @logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))
  end
  def perform
    @logger.add Logger::INFO, "logging from delayed_job"
    #do stuff
  end
end

Я пробовал различные уровни ведения журнала, и у меня есть config.log_level = :debug в конфигурации моей среды. Я запускаю delayed_job из monit. Я использую delayed_job 3.0.1 с ruby ​​1.9.3 и rails 3.0.10.


person freedrull    schedule 29.02.2012    source источник
comment
Одна из идей может состоять в том, что он конфликтует, потому что delayed_job также использует этот файл журнала. Вы пробовали другое имя?   -  person iltempo    schedule 01.03.2012
comment
Я пробовал другое имя. Новый файл журнала создается, но в него ничего не заносится.   -  person freedrull    schedule 06.03.2012


Ответы (4)


Объяснение может заключаться в том, что задание инициализируется только один раз на стороне производителя. Затем он сериализуется, доставляется через очередь (например, базу данных) и десериализуется в рабочем потоке. Но метод инициализации больше не вызывается в рабочем процессе. Только метод Perform вызывается через send.

Однако вы можете повторно использовать регистратор рабочих процессов для записи в файл журнала:

class MyJob
  def perform
    say "performing like hell"
  end

  def say(text)
    Delayed::Worker.logger.add(Logger::INFO, text)
  end
end

Не забудьте перезапустить воркеры.

person iltempo    schedule 11.03.2012
comment
Я получаю, что это TestJob не удалось с NoMethodError: неопределенный метод `добавить' для nil:NilClass. Ответ Рагуса исправил это. - person idrinkpabst; 24.04.2013

В RAILS_ROOT/config/initializers есть файл с именем delayed_job_config.rb со следующими строками:

Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger.auto_flushing = true

Не забудьте перезапустить своих рабочих после этого.

Позвольте мне знать, если это помогает

person raghus    schedule 13.03.2012
comment
auto_flushing устарел в rails 3 и, похоже, был удален в более поздних версиях. - person Jared Beck; 24.07.2017
comment
См. примечания об устаревании Rails-3.2, чтобы узнать о возможных способах устранения auto_flushing. - person Pete; 03.04.2018

Я не понимаю, почему вы установили регистратор в задании. Когда я это сделал, я настроил работника на использование определенного файла при запуске, например. Logger.new("log/worker_#{worker_number}"), который гарантирует, что каждый рабочий процесс выводит в свой собственный файл, и вам не нужно беспокоиться о том, что несколько рабочих процессов записывают в один и тот же файл одновременно (грязно).

Кроме того, в обычном рубине вы можете вызвать @logger.info "logging from delayed_job".

Наконец, я почти уверен, что «выполнение» вызывается непосредственно вашим работником и создается экземпляр, поэтому вы можете выполнить рефакторинг:

class MyJob
 def perform(blahblah)
  @logger.add Logger::INFO, "logging from delayed_job"
  @blahblah = blahblah
  #do stuff
 end
end
person TomDunning    schedule 12.03.2012
comment
На самом деле я не смог провести рефакторинг таким образом, я не думаю, что Perform принимает какие-либо аргументы. Я не пробовал ваш метод ведения журнала, так как предыдущий ответ сработал, но я помню, что пробовал это раньше, и это не сработало. - person freedrull; 14.03.2012
comment
Однако вы правы, я должен установить регистратор в инициализаторе или что-то в этом роде, а не устанавливать его в задании. - person freedrull; 14.03.2012

Это отлично работает для меня в Rails 3.2:

class FiveMinuteAggregateJob < Struct.new(:link, :timestamp)
  def perform
    Rails.logger.info 'yup.'
  end
end
person thisisbrians    schedule 09.10.2013