來源:《高性能日誌庫go-logger v2.0.3》
go-logger v2.0.3發佈,該版本主要針對性能進行優化. github地址:https://github.com/donnie4w/go-logger
go的結構化日誌庫非常多,go-logger是比較早期開發的一個庫, 以簡潔為主要特徵。simplelog是後期給數據庫binlog日誌開發的一個日誌庫,由於功能與go-logger有重合,就把兩個庫的代碼就合併了。目前兩個庫代都會一起更新,實現是一致的。
go1.21版本就在標準庫加上結構化日誌庫log/slog,該日誌庫性能非常優越,根據壓測結果,slog的性能要比社區常用的第三方結構化日誌庫好許多,所以大部分項目日誌庫可以直接使用slog。
go-logger 將繼續維護,原因是:
- go-logger 比slog佔用更少的內存,效率比slog更高
- go-logger 對日誌文件處理,如 日誌文件按大小切分備份,按日期:月,日,時切分備份,日誌文件壓縮備份,日誌文件限制最大文件數等特性,目前slog還不具備這些特徵。
go-logger 函數文檔
性能測試數據:
輸出數據:
2023-09-30T17:37:15.008+0800 DEBUG logtest/benchmark_test.go:103 >>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2023/09/30 17:37:19 benchmark_test.go:115: >>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2023/06/10 01:25:55.028277 log_test.go:46:>>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[DEBUG]2023/06/10 01:25:55.028277 log_test.go:55:>>>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
time=2023-09-30T17:37:38.395+08:00 level=INFO source=benchmark_test.go:164 msg=>>>aaaaaaaaaaaaaaaaaaaaaaa
參數説明:
- ns/op: 每執行一次消耗的時間
- B/op:每執行一次消耗的內存
- allocs/op:每執行一次分配內存次數
結果説明:
- 不同日誌庫輸出的數據大小是一致的
- Zap:uber 官方go日誌庫,測試中是 常規格式(包含文件名行號) debug日誌輸出
- Logger:go-logger 測試中是 常規格式(包含文件名行號) debug日誌輸出
- LoggerNoFORMAT: 為go-logger去格式化日誌輸出
- LoggerWrite: 為go-logger提供的原始數據高速寫入文件的方法,原是 simplelog 高效輸出數據庫binlog日誌數據的方法
- Slog:官方 log/slog 測試為常規格式(包含文件名行號)info 日誌輸出
可以看到 測試數據
- 時間消耗: go-logger 4500ns/op左右 , slog與zap大致在5600ns/op 左右
- 內存消耗:go-logger 64B , slog與zap大致在330ns/op 左右
- 不同機器跑測試程序會有不同的結果,這個主要是一個比較作用。
測試結果:
- 性能 : go-logger > slog ≥ zap
- 內存消耗 : go-logger 遠小於 slog 與 zap
説明:go-logger 性能與內存上的優勢,主要歸功於其內存使用上的優化
多次測試結果:
對比可知,不同時間測試結果都相似
- 可以看到,這幾個日誌庫的性能都非常高。可以根據項目的實際需求選擇使用任一日誌庫。
- 如果對性能與內存要求苛刻或對日誌文件備份處理有要求時, 建議使用go-logger。
- 如果官方日誌庫slog已經能滿足項目需求,建議使用slog,由官方維護的庫總是靠譜的;對於一般業務來説:性能4500ns/op與5600ns/op 並無實質區別。
- go-logger 會持續進行優化和維護,包括功能與性能.
測試程序
有任何問題或建議請Email:donnie4w@gmail.com或 https://tlnet.top/contact 發信給我,謝謝!