我正在使用 Rails 的 ActiveJob,我的一项工作将原始电子邮件作为输入。调试时,这可能会导致我的应用程序日志中出现大量噪音。我怎样才能避免这种情况?
[ActiveJob] Enqueued EmailParserJob (Job ID: 9678f343-c876-4f9f-9cc7-db440634e178) to DelayedJob(default) with arguments: "NOISE"
我正在使用 Rails 的 ActiveJob,我的一项工作将原始电子邮件作为输入。调试时,这可能会导致我的应用程序日志中出现大量噪音。我怎样才能避免这种情况?
[ActiveJob] Enqueued EmailParserJob (Job ID: 9678f343-c876-4f9f-9cc7-db440634e178) to DelayedJob(default) with arguments: "NOISE"
见https://github.com/rails/rails/blob/4-2-stable/activejob/lib/active_job/logging.rb#L10
ActiveJob::Base.logger = Logger.new(nil)
似乎唯一的方法是覆盖 ActiveJob 的内部日志记录方法:
class ActiveJob::Logging::LogSubscriber
private def args_info(job)
''
end
end
把它放在某个地方app/initializers/active_job_logger_patch.rb
。
在这里可能需要注意的一件事:在从 (Rails 5.1) ActiveJob::Base子类化的类的任何实例中(或者,由从 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) 包含require "active_job/logging"
在您的 application.rb 中
2)在config/development.rb(或任何你想要的环境)包括这一行:
config.active_job.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new("log/#{Rails.env}.log"))
3) ActiveJob 子类中的任何日志记录,使用它进行日志记录:
ActiveJob::Base.logger.info('(MyJob) Inside of a job but not going to STDOUT')
如果有人能指出解释为什么Rails.logger.info
在ActiveJob类中行为不同的代码,那将是一些很好的阅读。
我以前用after_initialize
钩子。事实证明,它只在perform_start
method 上有效,但在enqueue
.
使用on_load
方法钩住作品。我认为这是 Rails 中的延迟加载功能导致类在覆盖后加载。
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
log_arguments
从 Rails 6.1 开始,您可以像下面这样关闭日志记录。这将关闭从 派生的所有作业的记录参数ApplicationJob
,您也可以在每个作业的基础上设置它。
class ApplicationJob < ActiveJob::Base
self.log_arguments = false
end
参考:
看起来他们添加了功能添加一个选项以在 Rail 6 中禁用带有敏感参数的作业的日志记录。这将防止任何参数出现在日志行中。
编辑:要将其与 ActionMailer 一起使用,使用自定义邮件程序作业可能会起作用,我自己尚未对此进行测试。