#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文件中的作业开始/成功/失败。
这导致了大问题,包括检测工作中的错误和内存泄漏几乎是不可能的!请帮忙!
答案 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