如何防止记录Rails堆栈跟踪

4

我正在尝试降低日志中的噪音,并希望禁用Rails在错误期间记录堆栈跟踪。

由于我正在使用错误报告服务(Honeybadger.io),因此不需要在日志中看到堆栈跟踪,因为它已经在错误处理服务的异常报告中可用。

3个回答

2
默认的Rails中间件DebugExceptions是用来记录错误日志的。
你可以在config/environment.rbconfig/environments/production.rb中使用config.middleware.delete(ActionDispatch::DebugExceptions)来删除它。

1
根据文档,您应该能够添加一个回溯消音器,通过在块中返回true来排除每一行。
但是,至少在Rails 4.2.5.2中,这似乎不起作用,即使它起作用,您仍将在日志中得到有关异常的行。
偶然发现,如果您在消音器块内引发错误,则会抑制错误消息和整个回溯,这恰好是我要寻找的。
Rails.backtrace_cleaner.add_silencer { |_line| raise }

结合concise_logging gem,我现在可以拥有以下形式的日志:

enter image description here


Gerry,也许我的方法更好一些,可以看看我上面的回答。 - Mikhail Chuprynski
沉默器返回“true”无法帮助的原因是记录错误的DebugExceptions中间件将默认记录未过滤的跟踪信息,如果过滤后的跟踪信息为空。请参见https://github.com/rails/rails/blob/1b86d90136efb98c7b331a84ca163587307a49af/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L179-L180 - ejoubaud

0

嗯,Rails.backtrace_cleaner.add_silencer 是有效的,但我不认为它的行为是可预测的。

https://github.com/vipulnsward/rails/blob/ecc8f283cfc1b002b5141c527a827e74b770f2f0/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L155-L156

由于application_trace为空(这是因为错误不是来自用户代码而是路由错误),我们正在回退到framework_trace,它不会过滤它(仅过滤噪音)。

您可以通过创建自己的日志格式化程序来解决此问题。在您的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接