让工作延迟记录

#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文件中的作业开始/成功/失败。

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

我们已经通过攻击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_DEFAULT_LOGGER替换RAILS_DEFAULT_LOGGER

这可能是一个简单的解决方法,但它对我来说足够好:

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

简单但有效

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

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
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 

我只是这样做:

 /config/environments/development.rb MyApp::Application.configure do [...] [...] [...] Delayed::Worker.logger = Rails.logger end 

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

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

如果出现问题,似乎没有输出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”,则无需执行require。

资料来源: Rails延迟工作和图书馆课程

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

要解决此问题,请执行以下操作:

 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 

我刚才看到有关于此的stackoverflowpost – 不确定哪个:-)

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

 Notifier.delay.signup(user_id) 

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

现在,一旦您确保遵循上述指导原则 ,您就可以使用:

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

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

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

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

不要忘记更改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 

更详细的答案: 有delayed_job日志“put”,sql查询和作业状态