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.

4 ответа

Решение

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

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

class MyJob
  def perform
    say "performing like hell"
  end

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

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

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

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

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

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

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

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

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

class MyJob
 def perform(blahblah)
  @logger.add Logger::INFO, "logging from delayed_job"
  @blahblah = blahblah
  #do stuff
 end
end

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

class FiveMinuteAggregateJob < Struct.new(:link, :timestamp)
  def perform
    Rails.logger.info 'yup.'
  end
end
Другие вопросы по тегам