回溯清理器
回溯通常包含许多与正在审查的上下文无关的行。 这使得难以在回溯噪音中找到信号,并增加了调试时间。 使用 BacktraceCleaner
,过滤器和静默器用于删除噪音行,以便仅保留最相关的行。
过滤器用于修改数据行,而静默器用于完全删除行。 典型的过滤器用例是从每行开头删除冗长的路径信息,并查看与应用程序目录相关的文件路径,而不是文件系统根目录。 典型的静默器用例是将嘈杂库的输出从回溯中排除,以便您可以专注于其他内容。
bc = ActiveSupport::BacktraceCleaner.new
root = "#{Rails.root}/"
bc.add_filter { |line| line.delete_prefix(root) } # 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!
这两种方法将为您提供完全未经处理的回溯。
受 thoughtbot 的 Quiet Backtrace gem 的启发。
- A
- C
- F
- N
- R
常量
FORMATTED_GEMS_PATTERN | = | /\A[^\/]+ \([\w.]+\) / |
类公共方法
new() 链接
源代码:显示 | 在 GitHub 上
# 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
实例公共方法
add_filter(&block) 链接
从提供的块中添加一个过滤器。 回溯中的每一行都将映射到此过滤器。
# 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 }
源代码:显示 | 在 GitHub 上
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 83 def add_filter(&block) @filters << block end
add_silencer(&block) 链接
从提供的块中添加一个静默器。 如果静默器对给定行返回 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) }
源代码:显示 | 在 GitHub 上
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 92 def add_silencer(&block) @silencers << block end
clean(backtrace, kind = :silent) 链接
在所有过滤器和静默器都针对其运行后返回回溯。 过滤器先运行,然后是静默器。
源代码:显示 | 在 GitHub 上
# 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
clean_frame(frame, kind = :silent) 链接
返回已应用所有过滤器的帧。 如果帧被静默,则返回 nil
。
源代码:显示 | 在 GitHub 上
# 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
remove_filters!() 链接
删除所有过滤器,但保留静默器。 如果您突然需要查看您之前已过滤的回溯中的完整文件路径,这将很有用。
源代码:显示 | 在 GitHub 上
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 106 def remove_filters! @filters = [] end
remove_silencers!() 链接
删除所有静默器,但保留过滤器。 如果您的调试上下文突然扩展,因为您怀疑您使用的某个库存在错误,这将很有用。
源代码:显示 | 在 GitHub 上
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 99 def remove_silencers! @silencers = [] end