如何在Rails开发中忽略Delayed Job查询日志记录

16
我该如何在log/development.log中消除或忽略这些Delayed Job查询日志?
Delayed::Backend::ActiveRecord::Job Load (1.0ms)  UPDATE "delayed_jobs" SET locked_at = '2013-11-19 19:55:45.053991', locked_by = 'host:desktop-virtual pid:22277' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-11-19 19:55:45.053435' AND (locked_at IS NULL OR locked_at < '2013-11-19 15:55:45.053519') OR locked_by = 'host:desktop-virtual pid:22277') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *
Delayed::Backend::ActiveRecord::Job Load (1.4ms)  UPDATE "delayed_jobs" SET locked_at = '2013-11-19 19:55:50.056977', locked_by = 'host:desktop-virtual pid:22277' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-11-19 19:55:50.056484' AND (locked_at IS NULL OR locked_at < '2013-11-19 15:55:50.056530') OR locked_by = 'host:desktop-virtual pid:22277') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *

我尝试将以下代码添加到config/initializers/delayed_job.rb文件中,这样可以使所有内容都被路由,但间隔查询日志仍然会被放置在log/development.log文件中。

if Rails.env == "development"
  Delayed::Worker.logger = Logger.new(File.join(Rails.root, "log", "delayed_job.log"))
end

谢谢。

3个回答

23

之所以会出现日志行,是因为该行是由ActiveRecord记录的,而不是Delayed Job。有关更多信息,请参见GitHub错误报告。以下是解决方法:

config/initializers/delayed_job_silencer.rb中:

if Rails.env.development?
  module Delayed
    module Backend
      module ActiveRecord
        class Job
          class << self
            alias_method :reserve_original, :reserve
            def reserve(worker, max_run_time = Worker.max_run_time)
              previous_level = ::ActiveRecord::Base.logger.level
              ::ActiveRecord::Base.logger.level = Logger::WARN if previous_level < Logger::WARN
              value = reserve_original(worker, max_run_time)
              ::ActiveRecord::Base.logger.level = previous_level
              value
            end
          end
        end
      end
    end
  end
end

@MohamedElMahallawy 当然可以。它会隐藏日志中所有的 Delayed::Backend::ActiveRecord::Job 条目。 - Dennis
1
这个解决方案太过激进,延迟作业不会打印许多其他消息。 - Ohad Dahan
在Rails 3和DJ 4上对我有效。实际上,这与Rails版本无关,而与DJ版本有关,只要Job类中有reserve方法,此代码就会简单地掩盖它,在原始实现周围禁用AR日志记录并再次启用它。 - hammady

2

仅为Delayed job更改ActiveRecord日志级别。这将允许您查看其他ActiveRecord日志。

使用:

Delayed::Backend::ActiveRecord::Job.logger.level = 1

1
如果您的作业处理中有其他日志信息(例如发送电子邮件),如果将日志级别更改为1,则不会看到它们。 - akaspick

0

我认为您可以在初始化程序中如下设置日志级别。这有助于我忽略生产环境和开发环境日志中的延迟任务查询信息。

ActiveRecord::Base.logger.level = 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接