如何在 Rails 开发中忽略延迟作业查询日志记录

Posted

技术标签:

【中文标题】如何在 Rails 开发中忽略延迟作业查询日志记录【英文标题】:How to ignore Delayed Job query logging in development on Rails 【发布时间】:2013-12-03 13:47:36 【问题描述】:

如何使 log/development.log 中的这些延迟作业查询日志静音/忽略?

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

谢谢。

【问题讨论】:

【参考方案1】:

日志行仍然显示,因为该行是由 ActiveRecord 记录的,而不是延迟作业。有关更多信息,请参阅github bug report。这是一个解决方法:

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 条目。 此解决方案过于激进,延迟作业不会打印许多其他消息。 在 Rails 3 和 DJ 4 上为我工作。实际上它与 Rails 版本无关,它与 DJ 版本有关,只要您在 Job 类中有 reserve 方法,这段代码只是掩盖了它,禁用 AR 日志记录并围绕原始实现再次启用它。【参考方案2】:

仅为延迟作业更改 ActiveRecord 日志级别。 这将允许您查看其他 ActiveRecord 日志。

用途:

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

【讨论】:

如果您有来自作业处理的任何其他日志信息(例如正在发送的电子邮件),如果您将日志级别更改为 1,您将看不到它。【参考方案3】:

我认为您可以在初始化程序中将日志级别设置为 1,如下所示。它也有助于我忽略来自生产和开发日志的延迟作业查询信息。

ActiveRecord::Base.logger.level = 1

【讨论】:

以上是关于如何在 Rails 开发中忽略延迟作业查询日志记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ExceptionNotifier 在 Rails 3 中与延迟作业一起使用?

如何在 Ruby on Rails 中完成延迟作业后执行 ajax 回调?

如何查看延迟的作业队列?

Rails 4.2 从活动作业中获取延迟的作业 ID

检查延迟的作业是不是在rails中运行

Rails/Rspec:测试延迟作业邮件