2010-12-05 260 views
5

我尝试从rails中的delayed_job中记录日志。Log in from collectiveidea/delayed_job

我将其配置如下:

Delayed::Worker.destroy_failed_jobs = false 
Delayed::Worker.max_attempts = 3 
Delayed::Worker.backend = :active_record 
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/#{Rails.env}_delayed_jobs.log", Rails.logger.level) 
Delayed::Worker.logger.auto_flushing = 1 

定义我的工作:

class TestJob 

    def initialize(user) 
     @user = user 
    end 


    #called when enqueue is performed 
    def enqueue(job) 
     Delayed::Worker.logger.info("TestJob: enqueue was called") 
    end 

    def perform 
     Delayed::Worker.logger.info("\n\n\n\nTestJob: in perform, for user #{@user.twitter_username}") 
    end 
end 

但是当我打电话enquee对我的工作

Delayed::Job.enqueue(TestJob.new(user), 2) 

日志文件保持为空,甚至尽管delayed_jobs表显示作业已执行。

任何想法?

+1

看起来你并不孤单: http://stackoverflow.com/questions/3500200/getting-delayed-job-to-log – 2011-05-02 18:09:11

回答

0

不用DJ的名字空间试试吧。

这是我刚才使用的工作中的代码。注意:如果它已经存在,Logger.new将附加到.log文件。

class ScrapingJob < Struct.new(:keyword_id) 
    def perform 
     begin 
     ... 
     rescue => error 
     log = Logger.new("#{Rails.root}/log/scraping_errors.log") 
     log.debug "logger created for '#{keyword.text}' (#{keyword.id}) on '#{keyword.website.url}' (#{keyword.website.id})" 
     log.debug "time: #{measured_at.to_s(:short)}" 
     log.debug "error: #{error}" 
     log.debug "" 
     end 
    end 
    end 
0

我想这是一个序列化的问题与DJ试图序列化User对象。 DJ在提出这些错误方面做得不好。

你是否在使用Mongoid?我知道JSON化Mongoid对象存在问题。

如果将user_id字符串传递给Job而不是User对象,它会工作吗?像这样......

class TestJob 

    def initialize(user_id) 
     @user = User.find(user_id) 
    end 

    # ... 

end 

即使它是不是很漂亮,我认为这是通过文字(字符串,花车,等...),以DelayedJob或任何后台工作的最佳实践。这样可以更轻松地交换处理器,以防将来迁移到Resque。

相关问题