Go 中的快速、結構化、分級日誌記錄。
go get -u go.uber.org/zap
請注意,zap 僅支援 Go 的兩個最新小版本。
在性能良好但不重要的情況下,請使用SugaredLogger
。它比其他結構化日誌記錄套件快 4-10 倍,並且包含結構化和printf
風格的 API。
logger , _ := zap . NewProduction ()
defer logger . Sync () // flushes buffer, if any
sugar := logger . Sugar ()
sugar . Infow ( "failed to fetch URL" ,
// Structured context as loosely typed key-value pairs.
"url" , url ,
"attempt" , 3 ,
"backoff" , time . Second ,
)
sugar . Infof ( "Failed to fetch URL: %s" , url )
當效能和類型安全至關重要時,請使用Logger
。它甚至比SugaredLogger
更快並且分配的資源少得多,但它只支援結構化日誌記錄。
logger , _ := zap . NewProduction ()
defer logger . Sync ()
logger . Info ( "failed to fetch URL" ,
// Structured context as strongly typed Field values.
zap . String ( "url" , url ),
zap . Int ( "attempt" , 3 ),
zap . Duration ( "backoff" , time . Second ),
)
有關更多詳細信息,請參閱文件和常見問題。
對於登入熱路徑的應用程序,基於反射的序列化和字串格式化的成本非常高——它們是 CPU 密集型的,並且會進行許多小的分配。換句話說,使用encoding/json
和fmt.Fprintf
記錄大量的interface{}
會使你的應用程式變慢。
Zap 採用了不同的方法。它包括一個無反射、零分配的 JSON 編碼器,並且基本Logger
致力於盡可能避免序列化開銷和分配。透過在此基礎上建立高級SugaredLogger
,zap 允許使用者選擇何時需要計算每個分配以及何時更喜歡更熟悉的鬆散類型 API。
根據其自己的基準測試套件的測量,zap 不僅比同類結構化日誌記錄包性能更高,而且比標準庫更快。與所有基準一樣,請對這些持保留態度。 1
記錄一條訊息和 10 個欄位:
包裹 | 時間 | 切換時間% | 分配的對象 |
---|---|---|---|
⚡ 札普 | 656 奈秒/操作 | +0% | 5 個分配/操作 |
⚡ zap(加糖) | 935 奈秒/操作 | +43% | 10 個分配/操作 |
零日誌 | 380 奈秒/操作 | -42% | 1 個分配/操作 |
去套件 | 2249 奈秒/操作 | +243% | 57 個分配/操作 |
slog(LogAttrs) | 2479 奈秒/操作 | +278% | 40 個分配/操作 |
艱苦 | 2481 奈秒/操作 | +278% | 42 個分配/操作 |
頂點/對數 | 9591 奈秒/操作 | +1362% | 63 個分配/操作 |
日誌15 | 11393 奈秒/操作 | +1637% | 75 個分配/操作 |
洛魯斯 | 11654 奈秒/操作 | +1677% | 79 個分配/操作 |
使用已有 10 個上下文欄位的記錄器記錄訊息:
包裹 | 時間 | 切換時間% | 分配的對象 |
---|---|---|---|
⚡ 札普 | 67 奈秒/操作 | +0% | 0 分配/操作 |
⚡ zap(加糖) | 84 奈秒/操作 | +25% | 1 個分配/操作 |
零日誌 | 35 奈秒/操作 | -48% | 0 分配/操作 |
艱苦 | 193 奈秒/操作 | +188% | 0 分配/操作 |
slog(LogAttrs) | 200 奈秒/操作 | +199% | 0 分配/操作 |
去套件 | 2460 奈秒/操作 | +3572% | 56 個分配/操作 |
日誌15 | 9038 奈秒/操作 | +13390% | 70 個分配/操作 |
頂點/對數 | 9068 奈秒/操作 | +13434% | 53 個分配/操作 |
洛魯斯 | 10521 奈秒/操作 | +15603% | 68 個分配/操作 |
記錄靜態字串,沒有任何上下文或printf
樣式範本:
包裹 | 時間 | 切換時間% | 分配的對象 |
---|---|---|---|
⚡ 札普 | 63 奈秒/操作 | +0% | 0 分配/操作 |
⚡ zap(加糖) | 81 奈秒/操作 | +29% | 1 個分配/操作 |
零日誌 | 32 奈秒/操作 | -49% | 0 分配/操作 |
標準函式庫 | 124 奈秒/操作 | +97% | 1 個分配/操作 |
艱苦 | 196 奈秒/操作 | +211% | 0 分配/操作 |
slog(LogAttrs) | 200 奈秒/操作 | +217% | 0 分配/操作 |
去套件 | 213 奈秒/操作 | +238% | 9 個分配/操作 |
頂點/對數 | 771 奈秒/操作 | +1124% | 5 個分配/操作 |
洛魯斯 | 1439 奈秒/操作 | +2184% | 23 個分配/操作 |
日誌15 | 2069 奈秒/操作 | +3184% | 20 個分配/操作 |
所有 API 均已最終確定,且 1.x 系列版本中不會進行任何重大變更。支援 semver 的依賴管理系統的使用者應將 zap 固定到^1
。
我們鼓勵並支持一個活躍、健康的貢獻者社群—包括您!詳細資訊請參閱貢獻指南和行為準則。 zap 維護人員會密切注意問題和拉取請求,但您也可以向 [email protected] 報告任何負面行為。該電子郵件清單是一個私密、安全的空間;即使是 zap 維護者也無權訪問,所以請毫不猶豫地要求我們遵守高標準。
根據 MIT 許可證發布。
1特別請記住,我們可能會針對其他軟體包的稍舊版本進行基準測試。版本固定在 benchmarks/go.mod 檔案中。 ↩