」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go中如何實現禁用語句的高效日誌記錄?

Go中如何實現禁用語句的高效日誌記錄?

發佈於2024-11-08
瀏覽:140

How to Achieve Efficient Logging for Disabled Statements in Go?

Go 中禁用語句的高效日誌記錄

在關鍵路徑中,嵌入可以動態切換的調試/跟踪日誌記錄語句是有益的運轉時。這種做法非常適合調試離線生產系統或測試鏡像生產環境的系統。

但是,這種類型的日誌記錄有一個關鍵要求:禁用的語句必須對效能影響最小。在 C/C 中,這是透過 LOG 巨集實現的,該巨集抑制參數求值,直到檢查標誌為止。

在 Go 中實現禁用日誌記錄

在 Go 中模擬此行為提出了挑戰。將 io.Discard 與 log.Logger 一起使用不是一個選項,因為即使在停用時它也會格式化日誌訊息。

使用 EnabledLogger 結構的初始嘗試實現了 log.Logger 接口,根據 Enabled 啟用/禁用日誌記錄旗幟。但是,參數求值仍然不受抑制,可能會導致任意函數呼叫的效能問題。

兩種解決方法

要解決此問題,有兩種解決方法:

  1. 包裝類型: 利用包裝類型來延遲函數調用,確保在通過啟用的檢查之前不會計算表達式。
  2. 手動檢查: 使用啟用的檢查手動包裝日誌記錄語句,以防止在停用時執行。

這兩種方法都會導致冗長且容易出錯的程式碼,從而為潛在的效能下降打開了大門。

其他選項

儘管Go有靜態評估規則,但還有一些附加選項:

  • 自訂日誌格式化程序:利用fmt.Stringer和fmt.GoStringer 介面可以將參數格式化延遲到執行時間。
  • 運行時記錄器交換:整個日誌記錄機制可以透過記錄器介面或建置約束進行交換。
  • Go 程式碼產生: 高階程式碼產生技術可以透過解析 AST 並產生專門的偵錯版本來預處理程式碼。

雖然這些解決方案對於動態運行時配置並不理想,他們可以在特定場景中引入效能改進。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3