默认情况下,ActiveSupport::BacktraceCleaner
过滤与gems和Ruby stdlib对应的跟踪线。从ActiveSupport::BacktraceCleaner#initialize
(see the source)中调用以下两种方法。
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
(see the source)子目录不匹配的所有跟踪行:>
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
将不再出现在应用程序跟踪中。