Go中使用Zap日誌庫與Lumberjack日誌切割
Go中使用Zap日誌庫與Lumberjack日誌切割
Go中使用Zap日誌庫與Lumberjack日誌切割
概述
在專案中使用日誌記錄有助於快速定位和修復問題,能幫助我們監控系統健康狀態及時發現問題。Zap
是Uber開源的一個高效能、結構化、分級記錄的日誌記錄包。這篇筆記會簡單介紹Zap
,以及透過Lumberjack
元件根據檔案大小、日期來分割日誌檔案。
思路
Zap
的主要特點:
-
1. 高效能。
Zap
透過減少記憶體分配和避免interface{}
的使用,實現了極高的效能。
-
2. 結構化日誌。
Zap
支援結構化日誌記錄,方便將日誌資訊以鍵值對的方式記錄下來,對於日誌搜尋、分析和聚合很有幫助。 -
3. 日誌分級。
Zap
支援不同的日誌級別,包括Debug,Info,Warn,Error等。Debug
只在開發和調適階段啟用,在生產環境中使用會產生大量日誌影響效能。Info
用於幫助瞭解系統的正常執行情況,Warn
在生產環境中幫助提前發現和處理潛在問題。Error
在生產環境中用於記錄立即處理的錯誤和異常。
Zap
日誌庫中,有兩種主要的日誌記錄方式,分別是zap.Logger
和zap.SugaredLogger
。zap.Logger
效能更、型別更嚴格,在使用時需要指定欄位型別和名稱,雖然程式碼冗長但意思更明確。SugaredLogger
效能稍差(在大部分情況下可以忽略),但提供了簡化的API使用起來更便捷。 Zap
透過使用Lumberjack
第三方庫來實現日誌切割,Lumberjack
是一個用Go語言編寫的日誌滾動庫,將日誌檔案按照一定的規則進行拆分和歸檔,防止單個檔案過大影響效能或佔用太多的磁碟空間。Lumberjack
可以設定檔案最大值、根據檔案大小、日誌檔案數量、保留天數(設定檔案儲存天數,過期自動刪除)等條件來操作日誌檔案。
實現
Zap的安裝
go get -u go.uber.org/zap
Zap的使用
Logger
// 初始化loger
logger, err := zap.NewProduction() // 建立一個預配置的日誌管理器,用於生產環境
if err != nil{
panic(err)
}
defer logger.Sync() //重新整理快取日誌
logger.Info("hello zap info")
logger.Warn("hello zap warn")
logger.Error("hello zap error")
// 結構化日誌記錄
logger.Info("User Logged in",
zap.String("username", "Dawei"),
zap.Int("age", 20),
)
SugaredLogger
SugaredLogger
提供了簡便的方法使日誌更加易用。如Infow
和Infof
。Infow
用於記錄帶有鍵值對的日誌資訊,w
代表With
;Infof
用於記錄格式化字串的資訊日誌,f
代表format
。
// 初始化logger
logger, err := zap.NewProduction() // 建立一個預配置的日誌管理器,用於生產環境
if err != nil{
panic(err)
}
defer logger.Sync() //重新整理快取日誌
// 使用SugaredLogger
sugar := logger.Sugar()
sugar := logger.Sugar()
// 記錄帶有上下文的資訊
num := 12345
str := "夏天夏天悄悄過去"
sugar.Infow("Error 是因為", "數字", num, "語句", str)
sugar.Infof("Error %s", "留下小秘密")
// {"level":"info","ts":1718096086.7370722,"caller":"ZapDemo/main.go:26","msg":"Error 是因為","數字":12345,"語句":"夏天夏天悄悄過去"}
// {"level":"info","ts":1718096086.7371142,"caller":"ZapDemo/main.go:27","msg":"Error 留下小秘密"}
Lumberjack的安裝
go get gopkg.in/natefinch/lumberjack.v2
Lumberjack的使用
首先我們需要初始化Lumberjack
的配置,再將該配置新增到zap.logger
中。在Lumberjack
的配置中,可以指定Filename
日誌檔案的名稱和路徑、MaxSize
單個日誌檔案的最大值(如達到最大值就觸發滾動),MaxBackups
最大備份數,MaxAge
(日誌檔案最長保留期限),Compress
(是否壓縮舊檔案)
lumberjackLogger := &lumberjack.Logger{
Filename: "./project/ZapDemo/log/test.log",
MaxSize: 10, //MB
MaxBackups: 2,
MaxAge: 28, // days
Compress: true, // 是否壓縮檔案
}
// 初始化logger
zapLogger := zap.New(zapcore.NewCore(
zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()), //使用控制檯編碼器
zapcore.AddSync(lumberjackLogger), // 將日誌寫入到 lumberjackLogger 提供的輸出中
zap.InfoLevel, // 設定日誌級別為 InfoLevel,即只記錄 Info 級別及以上的日誌訊息
))
defer zapLogger.Sync()
for i := 0; i < 100; i++ {
str := fmt.Sprintf("hi %d", i)
zapLogger.Info(str)
}
Go · 目錄
上一篇基於GitLab搭建Go專案自動構建環境下一篇Casbin筆記(1)