14

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

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

7 回答 7

6

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

ActiveJob::Base.logger = Logger.new(nil)
于 2016-04-29T00:46:17.033 回答
5

似乎唯一的方法是覆盖 ActiveJob 的内部日志记录方法

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

把它放在某个地方app/initializers/active_job_logger_patch.rb

于 2015-08-17T13:39:19.977 回答
5

在这里可能需要注意的一件事:在从 (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.infoActiveJob类中行为不同的代码,那将是一些很好的阅读。

于 2017-10-11T04:15:15.653 回答
4

我以前用after_initialize钩子。事实证明,它只在perform_startmethod 上有效,但在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
于 2015-09-27T10:34:09.710 回答
2

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

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

参考:

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

于 2020-12-29T18:41:07.017 回答
1

在这里找到以下建议:

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

似乎比通过a更好nil

于 2020-06-05T05:05:06.483 回答
1

看起来他们添加了功能添加一个选项以在 Rail 6 中禁用带有敏感参数的作业的日志记录。这将防止任何参数出现在日志行中。

编辑:要将其与 ActionMailer 一起使用,使用自定义邮件程序作业可能会起作用,我自己尚未对此进行测试。

于 2020-08-06T06:43:48.800 回答