如何过滤或删除 ActiveJob 参数的日志记录?

How do I filter or remove logging of ActiveJob arguments?

我正在使用 Rails' ActiveJob,我的一项工作将原始电子邮件作为输入。调试时,这会导致我的应用程序日志中出现大量噪音。我怎样才能避免这种情况?

[ActiveJob] Enqueued EmailParserJob (Job ID: 9678f343-c876-4f9f-9cc7-db440634e178) to DelayedJob(default) with arguments: "NOISE"

看来唯一的办法就是覆盖 ActiveJob 的 internal logging method:

class ActiveJob::Logging::LogSubscriber
  private def args_info(job)
    ''
  end
end

把它放到 app/initializers/active_job_logger_patch.rb 的某个地方。

我事先用了after_initialize挂钩。事实证明它仅在 perform_start 方法中有效,但在 enqueue.
中无效 使用 on_load 方法挂钩工作。我认为这是 Rails 中的延迟加载功能导致 class 在覆盖后加载。

ActiveSupport.on_load :active_job do
  class ActiveJob::Logging::LogSubscriber
    private def args_info(job)
      # override this method to filter arguments shown in app log
    end
  end
end

https://github.com/rails/rails/blob/4-2-stable/activejob/lib/active_job/logging.rb#L10

ActiveJob::Base.logger = Logger.new(nil)

这里可能需要注意一件事:在 class 从 (Rails 5.1) [= 子class 的任何实例中37=](或者,由 class subclass 调用的任何 class 实例来自 ActiveJob::Base)正常的 Rails.logger.info('log this') 命令正在运行登录到 rails 控制台(大概是通过 STDOUT)。

我还没有完全弄清楚导致 Rails.logger 被劫持的机制,但是你可以切换到 ActiveJob::Base.logger 并使用这方面的知识:(https://github.com/rails/rails/blob/b205ea2dc6c70b2b8e2134640e3056ed33fdc6be/activejob/lib/active_job/logging.rb#L13 ) 以根据需要更改行为。

因此,这允许您根据需要登录:

1) 在您的 application.rb

中包含 require "active_job/logging"

2) 在 config/development.rb 中(或任何你想要的环境)包括这一行:

config.active_job.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new("log/#{Rails.env}.log"))

3) ActiveJob 子classes 内的任何日志记录,使用此进行日志记录:

ActiveJob::Base.logger.info('(MyJob) Inside of a job but not going to STDOUT')

如果有人能指出解释为什么 Rails.logger.infoActiveJob class 内部表现不同的代码,那将是一个很好的阅读。

找到以下推荐here

ActiveJob::Base.logger = Logger.new(IO::NULL)

似乎比通过一个nil

更好

他们似乎在 Rail 6 中添加了功能 Add an option to disable logging for jobs with sensitive arguments。这将防止任何参数出现在日志行中。

编辑:要将其与 ActionMailer 一起使用,using a custom mailer job 可能会起作用,我自己还没有测试过。

从 Rails 6.1 开始,您可以使用 log_arguments 关闭日志记录,如下所示。这将关闭记录从 ApplicationJob 派生的所有作业的参数,您也可以在每个作业的基础上设置它。

class ApplicationJob < ActiveJob::Base
  self.log_arguments = false
end

参考:

https://github.com/rails/rails/pull/37660