我无法记录来自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。
答案 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