延迟任务(delayed_job)未记录日志

7

我无法从我的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。我从monit运行delayed_job。我使用的是ruby 1.9.3和rails 3.0.10的delayed_job 3.0.1版本。


一个想法是它可能会发生冲突,因为delayed_job也在使用这个日志文件。你试过换一个名字吗? - iltempo
我尝试了一个不同的名称。新的日志文件已经被创建,但是没有记录任何信息。 - freedrull
4个回答

17
一个解释可能是,作业只在生产者端初始化一次。然后它被序列化、通过队列(例如数据库)传递并在工作者中反序列化。但是,在工作者进程中不会再次调用初始化方法。只有通过“send”调用执行方法。
但是,您可以重复使用工作者的记录器来写入日志文件:
class MyJob
  def perform
    say "performing like hell"
  end

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

别忘了重启工作进程。


1
我遇到了这个错误信息:“TestJob failed with NoMethodError: undefined method `add' for nil:NilClass”。Raghus的答案解决了这个问题。 - idrinkpabst

11

在RAILS_ROOT/config/initializers目录下有一个名为delayed_job_config.rb的文件,其中包含以下行:

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

记得在这样做后重新启动你的工作进程。

如果这有帮助,请告诉我。


1
auto_flushing 在 Rails 3 中已被弃用,似乎在后续版本中已被移除。 - Jared Beck
请查看Rails-3.2弃用通知,以获取有关删除auto_flushing的潜在解决方案。 - Pete
嗨,我尝试在delayed_job_config.rb中添加这些行,但延迟作业日志仍未写入Rails应用程序日志。 - Satria Janaka

3
我不明白为什么要在任务中设置记录器。当我这样做时,我会设置工作者开始使用特定的文件,例如Logger.new("log/worker_#{worker_number}"),这确保每个工作者输出到自己的文件,您不必担心多个工作者同时写入同一文件(混乱)。
此外,在普通的Ruby代码中,您可以调用@logger.info "logging from delayed_job"
最后,我相信'perform'是由您的工作者直接调用和实例化的,因此您可以进行重构:
class MyJob
 def perform(blahblah)
  @logger.add Logger::INFO, "logging from delayed_job"
  @blahblah = blahblah
  #do stuff
 end
end

我实际上无法以那种方式进行重构,我不认为perform接受任何参数。由于之前的答案有效,我没有尝试您的日志记录方法,但我记得以前尝试过它并且没有起作用。 - freedrull
你说得对,我应该在初始化程序或其他地方设置日志记录器,而不是在作业中设置它。 - freedrull

0

在Rails 3.2中,这对我来说完全正常:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接