如何过滤或删除 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.info
在 ActiveJob 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
参考:
我正在使用 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.info
在 ActiveJob 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
参考: