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

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

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

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 並產生專門的偵錯版本來預處理程式碼。

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

最新教學 更多>
  • Darshan Hiranandani 的解釋:如何使用 PHP 連接到 MySQL 資料庫?
    Darshan Hiranandani 的解釋:如何使用 PHP 連接到 MySQL 資料庫?
    大家好,我是 Darshan Hiranandani,我正在解釋如何使用 PHP 連接到 MySQL 資料庫? 要使用 PHP 連線到 MySQL 資料庫,您可以使用 mysqli 擴充或 PDO(PHP 資料物件)擴充。以下是這兩種方法的範例: 使用 mysqli 擴充
    程式設計 發佈於2024-11-09
  • 如何掌握 CSS 盒子模型以實現完美的網站佈局(+ Codepen 範例)
    如何掌握 CSS 盒子模型以實現完美的網站佈局(+ Codepen 範例)
    嘿,了不起的人!欢迎回到我的博客。 ?今天,我们将深入研究 CSS 盒子模型,揭秘如何确定每个元素的大小,以及如何使用这些知识来创建精确、现代和简洁的设计(本文末尾的实际示例)。 盒子模型简介 CSS 盒子模型是网页设计的基础,它规定了每个 HTML 元素如何在网页中占据空间。 盒子...
    程式設計 發佈於2024-11-09
  • 如何在空手道的讀取方法中參數化請求檔名?
    如何在空手道的讀取方法中參數化請求檔名?
    在Karate的讀取方法中參數化請求檔名嘗試使用Karate進行自動化API測試時,您可能會在嘗試透過時遇到問題將XML 檔案傳送到Read 方法,收到類似問題中提到的異常。當您在 Read 方法中使用變數表示檔案路徑(例如 read(varXmlFile))時,會發生這種情況。 要解決此問題,請確...
    程式設計 發佈於2024-11-09
  • 如何在 Pandas 中基於 If-Else-Else 條件建立列?
    如何在 Pandas 中基於 If-Else-Else 條件建立列?
    在 Pandas 中使用 If-Else-Else 條件建立列根據 if-elif-else條件建立新列,主要有兩種方法:非向量化方法此方法涉及定義一個對行進行操作的函數:def f(row): if row['A'] == row['B']: val = 0 eli...
    程式設計 發佈於2024-11-09
  • 建立更聰明的合約:Go 如何為 KALP Studio 的區塊鏈解決方案提供支援
    建立更聰明的合約:Go 如何為 KALP Studio 的區塊鏈解決方案提供支援
    随着区块链革命的蓬勃发展,开发智能合约对于利用区块链技术变得至关重要。智能合约本质上是去中心化应用程序 (dApp) 的支柱,有助于在没有中介的情况下促进、验证或执行协议。随着各种编程语言在智能合约开发中越来越受欢迎,Go(或 Golang) 越来越受欢迎。在这篇博客中,我们将深入探讨为什么 KAL...
    程式設計 發佈於2024-11-09
  • 在 Android 中實作 CheckBox Listener 時如何修復 Eclipse 錯誤?
    在 Android 中實作 CheckBox Listener 時如何修復 Eclipse 錯誤?
    Android CheckBox Listener:解決Eclipse 錯誤Android CheckBox Listener:解決Eclipse 錯誤嘗試在Android 中實作CheckBox 的偵聽器時,開發人員在使用時可能會遇到錯誤預設的OnCheckedChangeListener 類別。...
    程式設計 發佈於2024-11-09
  • 如何在 Linux 中使用「cpuid」指令存取 CPU 資訊?
    如何在 Linux 中使用「cpuid」指令存取 CPU 資訊?
    在Linux 上使用cpuid 指令存取CPU 資訊在這個問題中,開發人員試圖在Linux 環境中使用方法類似於Windows API 中的_cpuinfo() 函數。提供的程式碼嘗試利用彙編指令 (cpuid) 來檢索此訊息,但開發人員希望避免手動彙編的需要。 解決方案在於利用編譯程式碼時可用的 ...
    程式設計 發佈於2024-11-09
  • 如何確定 JavaScript 字串的位元組大小
    如何確定 JavaScript 字串的位元組大小
    確定JavaScript 字串的位元組大小在JavaScript 中,字串使用Unicode 字元編碼標準(稱為UCS-2)表示。這意味著字串中的每個字元通常由兩個位元組表示。但是,字串的實際位元組大小可能會有所不同,具體取決於傳輸過程中使用的字串編碼(例如 UTF-8)和特定瀏覽器實作等因素。 計...
    程式設計 發佈於2024-11-09
  • JavaScript 記憶
    JavaScript 記憶
    JavaScript 是一種功能強大的程式語言,在開發互動式網站方面發揮重要作用。然而,在處理複雜和資料密集型應用程式時,JavaScript 效能可能會成為一個問題。這就是記憶發揮作用的地方。透過釋放快取的力量,記憶化是一種可以顯著提高 JavaScript 效能的技術,使您的應用程式運行得更快、...
    程式設計 發佈於2024-11-09
  • 如何在 Linux 系統中使用 Python 建立預填輸入函數?
    如何在 Linux 系統中使用 Python 建立預填輸入函數?
    Python 中的輸入編輯Python 的 input() 和 raw_input() 函數本身不允許預先填入輸入編輯。然而,在Linux系統中,readline模組可以用來建立提供此功能的rlinput函數。 rlinput函數有兩個參數:prompt:顯示的提示字元給使用者。 prefill:在...
    程式設計 發佈於2024-11-09
  • 如何在 Java 中檢索文件建立日期?
    如何在 Java 中檢索文件建立日期?
    在Java 中檢索文件創建日期確定文件創建日期對於組織和管理文件至關重要,特別是在需要按時間順序排序時。在 Java 中,有一個利用 Java NIO 函式庫的解決方案。 NIO(新輸入/輸出)提供了檢索文件元資料(包括建立日期)的方法。僅當底層檔案系統支援時才能存取此元資料。 要使用NIO 存取檔...
    程式設計 發佈於2024-11-09
  • 如何用 Python 建立 Hangman 遊戲:逐步指南
    如何用 Python 建立 Hangman 遊戲:逐步指南
    Hangman 是一款经典的猜词游戏,非常有趣,对于初学者程序员来说是一个很棒的项目。 在本文中,我们将学习如何用 Python 构建一个简单版本的 Hangman 游戏。 最后,您将了解如何使用 Python 的基本控制结构、函数和列表来创建这个游戏。 什么是刽子手? Hang...
    程式設計 發佈於2024-11-09
  • 了解序列化和反序列化:方法、範例和最佳實踐
    了解序列化和反序列化:方法、範例和最佳實踐
    1.什麼是序列化和反序列化? 序列化和反序列化是將複雜的資料結構轉換為易於儲存或傳輸並隨後重建的格式的過程。 1.1 序列化 序列化是將物件或資料結構轉換為易於儲存(例如,在檔案或資料庫中)或傳輸(例如,透過網路)的格式的過程。這種格式通常是位元組流或文字格式,例...
    程式設計 發佈於2024-11-09
  • 根據建立日期向 MySQL 表格新增序號:逐步指南
    根據建立日期向 MySQL 表格新增序號:逐步指南
    隨著資料庫的成長和發展,我們經常發現自己需要新增欄位或修改現有結構。常見的場景是需要在現有資料表中新增序列 ID,特別是當我們希望該 ID 反映記錄所建立的時間順序時。在這篇部落格文章中,我們將逐步介紹在 MySQL 資料表中新增自動遞增序列 ID 的過程,該序列會依照建立日期列排序。 ...
    程式設計 發佈於2024-11-09
  • Angular 基礎:瞭解 TypeScript
    Angular 基礎:瞭解 TypeScript
    Angular 构建于 TypeScript 之上,它是 JavaScript 的超集,引入了类型安全,使开发人员能够在开发过程中而不是在运行时捕获潜在的错误。对于熟悉 TypeScript 的开发人员来说,这将是一个熟悉的场景,但如果您是 TypeScript 的新手,让我们回顾一下它的一些关键功...
    程式設計 發佈於2024-11-09

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

Copyright© 2022 湘ICP备2022001581号-3