7

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

+0

一种观点是,这是因为delayed_job的是利用这个日志文件,以及是相互矛盾的。你尝试过别的名字吗? – iltempo 2012-03-01 00:05:27

+0

我尝试了一个不同的名字。新的日志文件已创建,但没有记录到它。 – freedrull 2012-03-06 17:27:42

回答

16

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

但是可以重用工人记录写入日志文件:

class MyJob 
    def perform 
    say "performing like hell" 
    end 

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

不要忘了重新启动工人。

+0

此方法适用于我。谢谢! – freedrull 2012-03-13 19:36:39

+1

我得到这个“TestJob失败与NoMethodError:未定义的方法'添加为零:NilClass”。拉古斯的答案确定了这一点。 – idrinkpabst 2013-04-23 22:05:34

3

我不明白你为什么要在工作中设置记录器。当我完成这些工作时,我将工作人员设置为在开始时使用特定的文件,例如Logger.new("log/worker_#{worker_number}")确保每个工作人员输出到它自己的文件,并且您不必担心多个工作人员同时写入同一个文件(混乱)。

此外,在普通的醇红宝石,你可以拨打@logger.info "logging from delayed_job"

最后,我敢肯定,“执行”由你的工人直接调用和实例化,这样你就可以重构为:

class MyJob 
def perform(blahblah) 
    @logger.add Logger::INFO, "logging from delayed_job" 
    @blahblah = blahblah 
    #do stuff 
end 
end 
+0

我实际上不能重构那种方式,我不认为执行会带来任何争论。自从上一个答案奏效以来,我没有尝试过您的日志记录方法,但我相信我记得以前尝试过,并且它不起作用。 – freedrull 2012-03-14 17:06:22

+0

你说得对,我应该把记录器设置在初始化器或其他东西中,而不是将它设置在作业中。 – freedrull 2012-03-14 17:07:06

10

在RAILS_ROOT /配置/初始化呼吁delayed_job_config.rb文件与这些行:

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

记得在这样做后重新启动你的工人。

让我知道,如果这有助于

+0

'auto_flushing'在rails 3中被弃用,似乎已经在更高版本中被删除 – 2017-07-24 19:05:48

0

这工作得很好,我在Rails的3.2:

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