如何设置Rails的Backtrace Cleaner以仅显示“应用程序跟踪”或“框架跟踪”?

时间:2019-03-04 18:59:10

标签: ruby-on-rails ruby

默认情况下,ActiveSupport::BacktraceCleaner过滤与gems和Ruby stdlib对应的跟踪线。从ActiveSupport::BacktraceCleaner#initializesee 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::BacktraceCleanerActiveSupport::BacktraceCleaner的子类)还会过滤出与以下Rails.rootsee the source)子目录不匹配的所有跟踪行:

APP_DIRS_PATTERN = /^\/?(app|config|lib|test|\(\w*\))/
# ...
add_silencer { |line| !APP_DIRS_PATTERN.match?(line) }

这似乎是有问题的,因为Rails应用程序可能在app中具有除configlibtestRails.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将不再出现在应用程序跟踪中。

0 个答案:

没有答案