Как настроить Backtrace Cleaner в Rails для отображения только «Application Trace» или «Framework Trace»? - PullRequest
0 голосов
/ 04 марта 2019

По умолчанию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...