delayed_job没有记录

时间:2012-02-29 22:36:26

标签: ruby-on-rails ruby ruby-on-rails-3 delayed-job background-process

我无法记录来自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。我正在使用delayed_job 3.0.1和ruby 1.9.3以及rails 3.0.10。

4 个答案:

答案 0 :(得分:17)

解释可能是作业在生产者方面只被初始化一次。然后它被序列化,通过队列(例如数据库)传递并在worker中反序列化。但是,再次在工作进程中不调用initialize方法。只通过send调用perform方法。

但是,您可以重复使用workers记录器来写入日志文件:

class MyJob
  def perform
    say "performing like hell"
  end

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

不要忘记重新启动工作人员。

答案 1 :(得分:10)

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

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

请记住在执行此操作后重新启动您的员工。

如果有帮助,请告诉我

答案 2 :(得分:3)

我不明白为什么要在工作中设置记录器。当我完成此操作后,我将工作人员设置为在启动时使用特定文件,例如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

答案 3 :(得分:0)

在Rails 3.2中,这对我来说很合适:

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