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