Rails回溯消音器不起作用,而过滤器则不起作用

Eld*_*der 7 ruby-on-rails backtrace ruby-on-rails-4

Fresh Rails 4.2设置.我想抑制长错误回溯.在下面的回溯日志中,第一行对我来说已经足够了,接下来的4行可以删除

ActionController::RoutingError (No route matches [GET] "/user"):
  actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.2) lib/web_console/middleware.rb:37:in `call'
  actionpack (4.2.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.1) lib/rails/rack/logger.rb:38:in `call_app'
Run Code Online (Sandbox Code Playgroud)

我添加了一个新的消音器 backtrace_silencers.rb

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_silencer { |line| line =~ /lib/ }
Run Code Online (Sandbox Code Playgroud)

服务器重启后 - 没有任何反应,我仍然得到相同的回溯日志.(/lib/应该删除每一行匹配:http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.htm)

完整性检查:

> line = "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
=> "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
> line =~ /lib/
=> 19
Run Code Online (Sandbox Code Playgroud)

但过滤器工作:

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_filter { |line| line.gsub('lib', 'yeah!') }
Run Code Online (Sandbox Code Playgroud)

现在回溯看起来像这样:

ActionController::RoutingError (No route matches [GET] "/user"):
  actionpack (4.2.1) yeah!/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.2) yeah!/web_console/middleware.rb:37:in `call'
  actionpack (4.2.1) yeah!/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.1) yeah!/rails/rack/logger.rb:38:in `call_app'
Run Code Online (Sandbox Code Playgroud)

非常感谢如何使消音器工作.干杯!

Mik*_*ski 6

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

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

你可以通过创建你自己的 log_formatter 来达到你的监狱。在您development.rb和/或test.rb添加

config.log_formatter = SilentLogger.new
config.log_formatter.add_silencer { |line| line =~ /lib/ }
Run Code Online (Sandbox Code Playgroud)

并在模型中创建简单的类,只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
Run Code Online (Sandbox Code Playgroud)


Eld*_*der 4

问题在于 Minitest-Reporters gem(为 Minitest 输出添加颜色),它与 Rails 回溯过滤器混淆

要修复您需要添加以下内容test_helper.rb

Minitest::Reporters.use!(
  Minitest::Reporters::DefaultReporter.new,
  ENV,
  Minitest.backtrace_filter
)
Run Code Online (Sandbox Code Playgroud)

此处描述的问题和解决方案详细信息:https ://github.com/kern/minitest-reporters#caveats