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。 我从monit运行delayed_job。 我正在使用delayed_job 3.0.1和ruby 1.9.3以及rails 3.0.10。

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

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

 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"您可以将@logger.info "logging from delayed_job"

最后,我很确定’perform’是由你的worker直接调用并实例化的,所以你可以重构为:

 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