有delayed_job日志“put”,sql查询和作业状态

现在只将以下内容记录到logs/delayed_job.log

 2012-04-20T03:57:44+0000: Cacher completed after 5.3676 2012-04-20T03:57:44+0000: 1 jobs processed at 0.1744 j/s, 0 failed ... 

我要做的是让它也记录我的所有puts以及我的SQL查询,就像在开发模式下一样,除了它仍然记录到log/delayed_job.log

我尝试将以下内容添加到initializers/delayed_job_config.rb但没有运气:

 Delayed::Worker.logger = Rails.logger Delayed::Worker.logger.level = Logger::DEBUG 

(现在我的所有puts被记录,但没有更多的作业状态日志,仍然没有SQL查询)

也许这个链接对您有所帮助: https : //stackoverflow.com/a/7223681/445908

更新:更多关于看跌期权。 vs logger:

我不确定你将“put”结果存储到日志文件中的实现。 但是我认为总是使用“logger”代替“puts”可能是一个更好的选择。 原因是:

  1. 在大多数情况下, puts会降低你的性能(特别是在生产环境中,在我过去的所有项目中, puts都不允许出现在源代码中)(对于java程序员来说, System.out.println是相同的东西) )

  2. 总是使用logger ,因为它有5个默认级别:debug,info,warn,error,fatal,可以通过grep的工具进行控制和精美格式化和过滤。 例如可以在下面生成日志信息吗?

     07:27:48 INFO: in device_resource, options: queryem??ltres67@blur.com 07:27:48 INFO: cloudset: ??100 

在Rails v3.2.13中,您可以:

 Delayed::Worker.logger = ActiveSupport::Logger.new("log/delayed_job.log", Rails.logger.level) Delayed::Worker.logger.auto_flushing = 1 #only reassign AR logger if we're in a delayed process(rake task or script/delayed_job) if caller.last =~ /script\/delayed_job/ or (File.basename($0) == "rake" and ARGV[0] =~ /jobs\:work/) ActiveRecord::Base.logger = Delayed::Worker.logger end 

但是…… ActiveSupport :: BufferedLogger已被弃用https://github.com/rails/rails/blob/master/activesupport/lib/active_support/buffered_logger.rb#L18

另外,您可能想要正确旋转日志? 所以我认为这更好:

 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 

构造函数说保留大约5个日志文件,并在当前日志文件达到100Mb时旋转。 详情请见: http : //www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html#method-c-new

感谢: http : //www.heedspin.com/2011/01/17/delayed-job-logging.html获取灵感

对于OP来说这可能有点晚了,但这是一种不同的方法:使用DelayedJob插件来设置分配给Worker的Rails(和ActiveRecord :: Base)记录器。

两个步骤:在延迟作业初始化程序中,执行以下操作:

 require 'delayed_job_log_setup' Delayed::Worker.plugins << DelayedJobLogSetup 

插件本身(我显然放在lib / delayed_job_log_setup.rb中):

 require 'delayed_job' class DelayedJobLogSetup < Delayed::Plugin callbacks do |lifecycle| lifecycle.before(:execute) do |worker| Rails.logger = worker.logger ActiveRecord::Base.logger = worker.logger end end end 

不幸的是,我尝试使用猴子补丁Object#puts直接调用记录器(在插件内部)仍然没有按照OP的要求进行操作。

另一种方法是在rails应用程序的script/delayed_job文件中执行必要的日志文件配置。 我现在看起来像这样,

 #!/usr/bin/env ruby require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) require 'delayed/command' # This was added to make sure the DJ log has the same log level # as the rails app, and to ensure ActiveRecord uses the same log # when loaded inside a DJ worker process. # Delayed::Worker.logger ||= Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'), Rails.configuration.log_level) ActiveRecord::Base.logger = Delayed::Worker.logger Delayed::Command.new(ARGV).daemonize 

它非常简单明了,这种方法正在发生什么。

更重要的是,对于不涉及延迟工作进程的方案,不存在弄乱AR记录器的风险。 这种情况发生在我们身上,采用了与其他一些答案相似的不同方法,引起了许多令人头疼和困惑。