跳至內容 跳至搜尋

Backtrace Cleaner

Backtraces 通常包含許多與檢閱的內容無關的程式碼行。這使得難以在 backtrace 雜訊中找出訊號,並增加除錯時間。透過 BacktraceCleaner,使用篩選器和靜音器來移除雜訊程式碼行,以便只保留最相關的程式碼行。

篩選器用於修改資料行,而靜音器用於完全移除程式碼行。典型的篩選器使用案例是移除每行開頭冗長的路徑資訊,並檢視與應用程式目錄相關的文件路徑,而不是檔案系統根目錄。典型的靜音器使用案例是從 backtrace 中排除雜訊函式庫的輸出,以便專注於其他部分。

bc = ActiveSupport::BacktraceCleaner.new
bc.add_filter   { |line| line.gsub(Rails.root.to_s, '') } # 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!,這將還原 backtrace 至原始狀態。如果您需要重新設定現有的 BacktraceCleaner,使其不篩選或修改 backtrace 的任何程式碼行的路徑,您可以呼叫 BacktraceCleaner#remove_filters! 這兩個方法將提供完全未修改的 backtrace。

靈感來自 thoughtbot 的 Quiet Backtrace 寶石。

方法
A
C
F
N
R

常數

FORMATTED_GEMS_PATTERN = /\A[^\/]+ \([\w.]+\) /
 

類別公開方法

new()

# File activesupport/lib/active_support/backtrace_cleaner.rb, line 34
def initialize
  @filters, @silencers = [], []
  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"
backtrace_cleaner.add_filter { |line| line.gsub(Rails.root.to_s, '') }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 80
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) }
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 89
def add_silencer(&block)
  @silencers << block
end

clean(backtrace, kind = :silent)

在所有篩選器和靜音器對其執行後傳回追蹤記錄。篩選器先執行,然後才是靜音器。

別名:filter
# File activesupport/lib/active_support/backtrace_cleaner.rb, line 43
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

# File activesupport/lib/active_support/backtrace_cleaner.rb, line 59
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

filter(backtrace, kind = :silent)

別名:clean

remove_filters!()

移除所有篩選器,但保留靜音器。如果你突然需要在追蹤記錄中看到你已經篩選出的完整檔案路徑,這會很有用。

# File activesupport/lib/active_support/backtrace_cleaner.rb, line 103
def remove_filters!
  @filters = []
end

remove_silencers!()

移除所有靜音器,但保留篩選器。如果你懷疑你使用的其中一個函式庫有錯誤,而你的偵錯範圍突然擴大,這會很有用。

# File activesupport/lib/active_support/backtrace_cleaner.rb, line 96
def remove_silencers!
  @silencers = []
end