Backtrace Silencer无法正常工作

在我的Rails应用程序中,我已经设置了以下backtrace消音器,正如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”没有任何区别。

这是因为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 =~ /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 

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