繁体   English   中英

delay_job未记录

[英]delayed_job not logging

我无法记录我的delay_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运行delay_job。 我正在将delay_job 3.0.1与ruby 1.9.3和rails 3.0.10一起使用。

一个推断可能是作业在生产者端仅初始化一次。 然后将其序列化,通过队列(例如数据库)传递,并在工作线程中取消序列化。 但是不会在工作进程中再次调用initialize方法。 通过send仅调用perform方法。

但是,您可以重用worker记录器以写入日志文件:

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中,有一个名为delay_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"

最后,我很确定'perform'是由您的工作人员直接调用并实例化的,因此您可以重构为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM