3

现在只有以下内容被记录到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 查询)

4

4 回答 4

8

在 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 的灵感

于 2013-05-10T04:16:17.707 回答
3

这对于 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 的要求。

于 2014-10-28T01:57:00.643 回答
3

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

更新:关于看跌期权的更多信息。与记录器:

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

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

  2. 始终使用logger,因为它有 5 个默认级别:调试、信息、警告、错误、致命,可以通过grep. 例如可以puts生成下面的日志信息吗?

    07:27:48 INFO: in device_resource, options: queryem??ltres67@blur.com 
    07:27:48 INFO: cloudset: ??100 
    
于 2012-04-20T05:03:17.993 回答
0

script/delayed_job另一种方法是在 Rails 应用程序的文件中进行必要的日志文件配置。我的现在是这个样子

#!/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 记录器的风险。这发生在我们身上,采用与其他一些答案类似的不同方法,并引起了许多头痛和困惑。

于 2015-02-14T01:08:21.610 回答