【发布时间】:2016-03-08 22:31:14
【问题描述】:
我正在尝试减少日志中的噪音,并希望禁用 Rails 在错误期间记录堆栈跟踪。
由于我使用的是错误报告服务 (Honeybadger.io),因此我不需要在日志中查看堆栈跟踪,因为它已经在错误处理服务的异常报告中可用。
【问题讨论】:
标签: ruby-on-rails logging
我正在尝试减少日志中的噪音,并希望禁用 Rails 在错误期间记录堆栈跟踪。
由于我使用的是错误报告服务 (Honeybadger.io),因此我不需要在日志中查看堆栈跟踪,因为它已经在错误处理服务的异常报告中可用。
【问题讨论】:
标签: ruby-on-rails logging
默认的 Rails 中间件 DebugExceptions 就是 logs the errors。
您可以在config/environment.rb 或config/environments/production.rb 中使用config.middleware.delete(ActionDispatch::DebugExceptions) 将其删除
【讨论】:
根据文档,您应该能够添加一个回溯消音器,通过在块中返回 true 来排除每一行。
但是,至少对于 Rails 4.2.5.2,这似乎不起作用,即使它确实起作用,您最终仍会在日志中看到有关异常的一行。
我无意中发现,如果您在消音器块内引发错误,这将抑制错误消息和整个回溯,这正是我正在寻找的。p>
Rails.backtrace_cleaner.add_silencer { |_line| raise }
将这个 hack 与 concise_logging gem 结合起来,我现在可以拥有如下所示的日志:
【讨论】:
true 没有帮助的原因是,如果过滤后的跟踪为空,则记录错误的DebugExceptions 中间件将默认记录未过滤的跟踪。见github.com/rails/rails/blob/…
好吧,Rails.backtrace_cleaner.add_silencer 有效,但我认为它的行为是可预测的
由于application_trace 是空的(这是因为错误不是来自用户代码而是路由错误),我们将退回到framework_trace,它不会过滤它(它只过滤噪音)。
您可以通过创建自己的 log_formatter 来解决它。在您的development.rb 和/或test.rb 添加
config.log_formatter = SilentLogger.new
config.log_formatter.add_silencer { |line| line =~ /lib/ }
并在模型中创建简单的类,只需要方法call。在那里,您可以根据需要修改回溯。
class SilentLogger
def initialize
@silencers = []
end
def add_silencer(&block)
@silencers << block
end
def call(severity, timestamp, progname, msg)
backtrace = (String === msg) ? "#{msg}\n" : "#{msg.inspect}\n"
return backtrace if @silencers.empty?
@silencers.each do |s|
backtrace = backtrace.split("\n").delete_if { |line| s.call(line) }
end
backtrace.join("\n")
end
end
【讨论】: