Go 中的低成本追蹤日誌記錄:在沒有效能開銷的情況下停用日誌語句
能夠在不影響關鍵路徑的情況下新增調試日誌語句生產效能至關重要。然而,在 Go 中,評估禁用語句的參數的成本可能會很大。
自訂的 Logger
為了解決這個問題,可以建立一個 EnabledLogger,實作log.Logger 介面並僅在啟用時將輸出委託給 log.Logger。這在禁用時有效地隱藏了格式化和日誌記錄操作。
EnabledLogger 的限制
雖然EnabledLogger 最大限度地減少了簡單資料類型的評估成本,但它不處理任意資料類型日誌中的函數呼叫或語句中的函數呼叫或語句複雜表達式。為了緩解這種情況,有兩個選項可用:
包裝類型:
像Stringify 這樣的包裝類型可以推遲僅在啟用時才評估的函數調用。雖然很冗長,但這種方法確保格式化被延遲到執行。
手動檢查:
明確檢查也可用於有條件地執行格式化,但這是容易出錯,需要仔細注意以確保一致性。
替代解決方案
除了這些選項之外,其他方法包括:
格式化程式介面:
fmt.Stringer 和fmt.GoStringer 可用來延遲實作這些介面的類型的格式化。
自訂記錄器:
在運行時使用自訂記錄器覆蓋預設記錄器可以更好地控制資料評估。
作為布林值的記錄器:
一個簡單而有效的技術就是使用bool 值作為記錄器本身,透過消除if 語句的需要來簡化程式碼。
程式碼生成:
可以在 Go 中模擬預處理巨集使用程式碼生成,產生僅包含必要的追蹤語句的偵錯版本。
以上是如何在 Go 中實現高效、低成本的追蹤日誌記錄而不產生效能開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!