По умолчанию ActiveSupport::BacktraceCleaner
фильтрует наши линии трассировки, соответствующие гемам и Ruby stdlib.Оба следующих метода вызываются из ActiveSupport::BacktraceCleaner#initialize
( см. Источник ).
def add_gem_silencer
add_silencer { |line| FORMATTED_GEMS_PATTERN.match?(line) }
end
def add_stdlib_silencer
add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) }
end
Также по умолчанию Rails::BacktraceCleaner
(подкласс ActiveSupport::BacktraceCleaner
) отфильтровывает вселинии трассировки, которые не соответствуют следующим подкаталогам Rails.root
( см. источник ):
APP_DIRS_PATTERN = /^\/?(app|config|lib|test|\(\w*\))/
# ...
add_silencer { |line| !APP_DIRS_PATTERN.match?(line) }
Это кажется проблематичным, поскольку приложение Rails может иметь пользовательские каталоги, отличные от app
, config
, lib
и test
в Rails.root
и, IMO, файлы в таких пользовательских каталогах должны появляться в трассировке приложения.
Я реализую нечто подобное в active_record_query_trace gem , который можно настроить для отображения только трассировки приложения, каркаса или обоих.Я нашел то, что кажется гораздо более простым подходом:
Когда установлено отображение только трассировки приложения:
RAILS_ROOT_EXCEPT_VENDOR_REGEXP = %r{#{Regexp.escape(Rails.root)}/(?!vendor)}
Rails.backtrace_cleaner.remove_silencers!
Rails.backtrace_cleaner.add_silencer do |line|
!line.match?(RAILS_ROOT_EXCEPT_VENDOR_REGEXP)
end
Когда установлено отображение только трассировки платформы:
Rails.backtrace_cleaner.remove_silencers!
Rails.backtrace_cleaner.add_silencer do |line|
line.match(RAILS_ROOT_EXCEPT_VENDOR_REGEXP)
end
Если бы это было так просто, разработчики Rails, вероятно, использовали бы что-то вроде этого.Так что я, наверное, что-то упустил, и я хотел бы, чтобы ваша помощь выяснила, что это такое.Можете ли вы вспомнить какие-либо крайние случаи, которые могут не работать с вышеуказанными глушителями?
Редактировать: Обнаружена возможная проблема: если фильтр используется для отображения только относительного пути линий трассировки приложения, вышеуказанные глушители не будутработать как Rails.root
больше не будет отображаться в приложении backtrace.