Backtrace Silencer无法正常工作

时间:2015-03-03 16:24:10

标签: ruby-on-rails

在我的Rails应用程序中,我已经设置了以下回溯消音器,正如Michael Hartl在他的Rails教程中所建议的那样:

Rails.backtrace_cleaner.add_silencer { |line| line =~ /rvm/ }

但我仍然得到了我打算过滤的所有噪音:

7:13:55 - INFO - Running: test/controllers/tags_controller_test.rb
Started

ERROR["test_should_get_index", TagsControllerTest, 0.45206]
test_should_get_index#TagsControllerTest (0.45s)
ActionController::UrlGenerationError:               
ActionController::UrlGenerationError: No route matches {:action=>"index", :controller=>"tags"}
        /Users/chris/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.1.6/lib/action_dispatch/journey/formatter.rb:39:in `generate'
        /Users/chris/.rvm/gems/ruby-2.0.0-p353/gems/actionpack-4.1.6/lib/action_dispatch/routing/route_set.rb:599:in `generate'

显然,字符串“rvm”出现在最后两行中。但他们仍然出现了。将字符串更改为“.rvm”没有任何区别。

2 个答案:

答案 0 :(得分:4)

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

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

您可以通过创建自己的log_formatter来解决它。在development.rb和/或test.rb添加

config.log_formatter = SilentLogger.new
config.log_formatter.add_silencer { |line| line =~ /rvm/ }

在模型中创建只需要方法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

答案 1 :(得分:-2)

您的日志显示/.rvm/您的设置/rvm/ - 这可能是原因吗? 试一试,不要忘记停止/重启服务器。