Глушитель Backtrace не работает

В моем приложении Rails я установил следующий глушитель backtrace, как предложил Майкл Хартл в своем учебнике 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" не имело никакого значения.

Ответ 1

Это из-за 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

Ответ 2

В ваших журналах отображается /.rvm/ ваша настройка /rvm/ - может ли это быть причиной? Попробуйте и не забудьте остановить/перезапустить сервер.