延迟工作记录

时间:2010-08-17 07:25:52

标签: ruby-on-rails delayed-job

#Here is how I have delayed job set up.

Delayed::Worker.backend = :active_record
#Delayed::Worker.logger = Rails.logger
Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/
##{Rails.env}_delayed_jobs.log", Rails.logger.level)
Delayed::Worker.logger.auto_flushing = 1
class Delayed::Job
    def logger
        Delayed::Worker.logger
    end
end
if JobsCommon::check_job_exists("PeriodicJob").blank?
    Delayed::Job.enqueue PeriodicJob.new(), 0, 30.seconds.from_now
end
#end


#Here is my simple job.

class PeriodicJob
    def perform
        Rails.logger.info "Periodic job writing #{Time.now}"
            Delayed::Job.enqueue PeriodicJob.new(), 0,
30.seconds.from_now
    end
end

我在rails日志或延迟的作业日志文件中看不到来自延迟作业的任何日志消息,我看到的唯一消息是delayed_jobs.log文件中的作业开始/成功/失败。

这导致了大问题,包括检测工作中的错误和内存泄漏几乎是不可能的!请帮忙!

6 个答案:

答案 0 :(得分:8)

我们已经通过攻击Rails.logger本身来使用不同的日志文件(我们想要的delayed_job条目)以及设置延迟的作业记录器来使用Rails 3 / Delayed Job 2.0.3。完全相同的对象:

file_handle = File.open("log/#{Rails.env}_delayed_jobs.log", (File::WRONLY | File::APPEND | File::CREAT))
# Be paranoid about syncing, part #1
file_handle.sync = true
# Be paranoid about syncing, part #2
Rails.logger.auto_flushing = true
# Hack the existing Rails.logger object to use our new file handle
Rails.logger.instance_variable_set :@log, file_handle
# Calls to Rails.logger go to the same object as Delayed::Worker.logger
Delayed::Worker.logger = Rails.logger

如果上述代码无效,请尝试将Rails.logger替换为RAILS_DEFAULT_LOGGER

答案 1 :(得分:6)

这可能是一个简单的解决方法,但对我来说效果很好:

system("echo #{your message here} >> logfile.log")

简单但有效

答案 2 :(得分:4)

我在初始化程序中使用以下设置:


require 'delayed/worker'

Delayed::Worker.logger = Rails.logger

module Delayed
  class Worker
    def say_with_flushing(text, level = Logger::INFO)
      if logger
        say_without_flushing(text, level)
        logger.flush
      end
    end
    alias_method_chain :say, :flushing
  end
end


答案 3 :(得分:4)

我只是这样做了:

/config/environments/development.rb

MyApp::Application.configure do

 [...]


 [...]


 [...]

 Delayed::Worker.logger = Rails.logger

end

在您执行的每个下一个请求中,邮件都会显示在日志中。

注意:有时您必须刷新页面以登录日志。不要忘记重启服务器;)

答案 4 :(得分:1)

如果出现问题,似乎没有输出DelayedJob:

1-需要并初始化非活动记录类:

如何: 创建文件config / initializers / load_classes_for_dj.rb 添加一行:

require 'lib/libtest/delayed_test.rb'
DelayedTest

请注意,如果config / application.rb中的config.autoload_paths中有'#{config.root} / lib / libtest',则无需执行此操作。

来源: Rails Delayed Job & Library Class

2-实现Singleton模块的类将无法通过调用: SingletonClass.instance.delay.sayhello

为了解决这个问题,请执行以下操作:

class SingletonClass
 include Singleton

 # create a class method that does the call for you
 def self.delayed_sayhello
  SingletonClass.instance.sayhello
 end

 def sayhello
  # this is how you can actually write to delayed_job.log
  # https://stackoverflow.com/questions/9507765/delayed-job-not-logging
  Delayed::Worker.logger.add(Logger::INFO, "hello there")
 end
end

要调用延迟类方法,请执行以下操作:

SingletonClass.delay.delayed_sayhello

是的,我在这里打电话给.delay。由于Ruby中的类也是对象,因此调用在此处有效并允许我访问类方法“delayed_sayhello”

3-不要将ActiveRecord对象或某些复杂对象传递给您的调用,而是传递ID,在延迟方法中查找数据库中的对象,然后执行您的工作:

不要这样做:

DelayedClass.new.delay.do_some_processing_on_album Album.first

做这个安装:

    DelayedClass.new.delay.do_some_processing_on_album Album.first.id

并在DelayedClass do_some_processing_on_album内,执行

a = Album.find_by_id id

有一个关于这个的stackoverflow帖子我刚才看到 - 不确定哪个: - )

4-完成后,这是邮件的处理方法(不要调用传递方法):

Notifier.delay.signup(user_id)

根据3,不要传递用户的对象而是传递他们的id,在注册方法中进行查找。

现在,一旦确定您已遵循上述指南,就可以使用:

Delayed::Worker.logger.add(Logger::INFO, "hello")

如果您仍然遇到问题,我建议您解决问题:

a-创建一个新课程 b-确保按照步骤1包含并初始化它 c-从步骤4添加日志记录并尝试调用MyNewClass.new.delay以查看它是否有效

我希望这可以帮助你们: - )

答案 5 :(得分:0)

不要忘记更改ActiveRecord :: Base.logger

Delayed::Worker.logger = Logger.new("log/delayed_job.log", 5, 104857600)
if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/)
  ActiveRecord::Base.logger = Delayed::Worker.logger
end

更详细的回答:Have delayed_job log "puts", sql queries and jobs status