Jep*_*erg 11 ruby-on-rails activesupport rails-activejob
我正在使用Rails的ActiveJob,我的一个工作是将原始电子邮件作为输入.调试时,这可能会导致应用程序日志中出现大量噪音.我怎么能避免这种情况?
[ActiveJob] Enqueued EmailParserJob (Job ID: 9678f343-c876-4f9f-9cc7-db440634e178) to DelayedJob(default) with arguments: "NOISE"
Run Code Online (Sandbox Code Playgroud)
见https://github.com/rails/rails/blob/4-2-stable/activejob/lib/active_job/logging.rb#L10
ActiveJob::Base.logger = Logger.new(nil)
Run Code Online (Sandbox Code Playgroud)
这里需要注意的一件事可能有用:在从 (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"))
Run Code Online (Sandbox Code Playgroud)
3) ActiveJob 子类内部的任何日志记录,请使用它进行日志记录:
ActiveJob::Base.logger.info('(MyJob) Inside of a job but not going to STDOUT')
Run Code Online (Sandbox Code Playgroud)
如果有人能指出代码来解释为什么在ActiveJobRails.logger.info类内部时表现不同,那么这将是一些很好的阅读。
似乎唯一的方法是覆盖 ActiveJob 的内部日志记录方法:
class ActiveJob::Logging::LogSubscriber
private def args_info(job)
''
end
end
Run Code Online (Sandbox Code Playgroud)
把它放在某个地方app/initializers/active_job_logger_patch.rb。
log_arguments从 Rails 6.1 开始,您可以像下面这样关闭日志记录。这将关闭记录从 派生的所有作业的参数ApplicationJob,您也可以基于每个作业进行设置。
class ApplicationJob < ActiveJob::Base
self.log_arguments = false
end
Run Code Online (Sandbox Code Playgroud)
参考:
https://github.com/rails/rails/pull/37660