Глушитель 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/
- может ли это быть причиной?
Попробуйте и не забудьте остановить/перезапустить сервер.