class ActiveSupport::BacktraceCleaner
Очиститель строк трассировки
Строки трассировки часто содержат много строк, не относящихся к рассматриваемому контексту. Это затрудняет поиск сигнала среди шума строк трассировки и увеличивает время отладки. С помощью BacktraceCleaner, используются фильтры и глушители для удаления шумных строк, оставляя только самые релевантные.
Фильтры используются для изменения строк данных, а глушители — для полного удаления строк. Типичный пример использования фильтра — удаление длинных путей из начала каждой строки и отображение путей файлов, относящихся к каталогу приложения, вместо корня файловой системы. Типичный пример использования глушителя — исключение вывода шумной библиотеки из строк трассировки, чтобы сосредоточиться на остальном.
bc = ActiveSupport::BacktraceCleaner.new
root = "#{Rails.root}/"
bc.add_filter { |line| line.start_with?(root) ? line.from(root.size) : line } # strip the Rails.root prefix
bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
bc.clean(exception.backtrace) # perform the cleanup
Для переконфигурации существующего BacktraceCleaner (например, по умолчанию в Rails) и отображения максимального количества данных, можно всегда вызвать BacktraceCleaner#remove_silencers!, что восстановит строки трассировки в первозданном виде. Если вам нужно переконфигурировать существующий BacktraceCleaner, чтобы он не фильтровал или не изменял пути строк трассировки, можно вызвать BacktraceCleaner#remove_filters!. Эти два метода предоставят вам совершенно нетронутые строки трассировки.
Вдохновлено плагином Quiet Backtrace от thoughtbot.
Константы
- FORMATTED_GEMS_PATTERN
Публичные методы класса
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 35 def initialize @filters, @silencers = [], [] add_core_silencer add_gem_filter add_gem_silencer add_stdlib_silencer end
Публичные методы экземпляра
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 83 def add_filter(&block) @filters << block end
Добавляет фильтр из предоставленного блока. Каждая строка в строках трассировки будет сопоставлена с этим фильтром.
# Will turn "/my/rails/root/app/models/person.rb" into "app/models/person.rb"
root = "#{Rails.root}/"
backtrace_cleaner.add_filter { |line| line.start_with?(root) ? line.from(root.size) : line }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 92 def add_silencer(&block) @silencers << block end
Добавляет глушитель из предоставленного блока. Если глушитель возвращает true для заданной строки, она будет исключена из очищенных строк трассировки.
# Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
backtrace_cleaner.add_silencer { |line| /puma/.match?(line) }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 45
def clean(backtrace, kind = :silent)
filtered = filter_backtrace(backtrace)
case kind
when :silent
silence(filtered)
when :noise
noise(filtered)
else
filtered
end
end Возвращает строки трассировки после применения всех фильтров и глушителей. Фильтры применяются первыми, затем глушители.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 61
def clean_frame(frame, kind = :silent)
frame = frame.to_s
@filters.each do |f|
frame = f.call(frame.to_s)
end
case kind
when :silent
frame unless @silencers.any? { |s| s.call(frame) }
when :noise
frame if @silencers.any? { |s| s.call(frame) }
else
frame
end
end Возвращает строку с примененными всеми фильтрами. Возвращает nil если строка была заглушена.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 106 def remove_filters! @filters = [] end
Удаляет все фильтры, но оставляет глушители. Полезно, если вам внезапно нужно увидеть полные пути в строках трассировки, которые вы уже отфильтровали.
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 99 def remove_silencers! @silencers = [] end
Удаляет все глушители, но оставляет фильтры. Полезно, если ваш контекст отладки внезапно расширился, и вы подозреваете ошибку в одной из используемых вами библиотек.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.