在Go 中,追蹤日誌記錄提出了一個獨特的挑戰:最大限度地減少關鍵路徑中停用日誌語句的成本。與 C/C 不同,Go 沒有預處理器宏,因此有必要探索替代解決方案。
一種方法涉及使用 fmt.Stringer 和 fmt.GoStringer 介面。透過將格式化延遲到日誌執行,可以避免日誌記錄參數中昂貴的函數呼叫:
type LogFormatter interface { LogFormat() string } // Inside the logger if i, ok := i.(LogFormatter); ok { fmt.Println(i.LogFormat()) }
另一種策略是在運行時使用記錄器介面或在建置時使用建置約束交換記錄器。但是,這需要確保不會將昂貴的呼叫插入到日誌記錄參數中。
第三個選項是將Logger 本身定義為bool,減少冗長,同時提供一種簡潔的方法來控制日誌記錄:
type Log bool func (l Log) Println(args ...interface{}) { fmt.Println(args...) } var debug Log = false if debug { debug.Println("DEBUGGING") }
最後,可以探索程式碼生成,儘管它不適合運行時配置。透過使用 gofmt -r 或使用文字/模板建立文件,可以為特定的偵錯場景建立單獨的偵錯版本。
以上是如何最小化 Go 中禁用追蹤日誌記錄語句的成本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!