Go中使用Zap日誌庫與Lumberjack日誌切割

技术颜良發表於2024-08-04

Go中使用Zap日誌庫與Lumberjack日誌切割

Go中使用Zap日誌庫與Lumberjack日誌切割

原創 何澤豐 ProgrammerHe

Go中使用Zap日誌庫與Lumberjack日誌切割

概述

在專案中使用日誌記錄有助於快速定位和修復問題,能幫助我們監控系統健康狀態及時發現問題。Zap是Uber開源的一個高效能、結構化、分級記錄的日誌記錄包。這篇筆記會簡單介紹Zap,以及透過Lumberjack元件根據檔案大小、日期來分割日誌檔案。

思路

Zap的主要特點:

  1. 1. 高效能Zap透過減少記憶體分配和避免interface{}的使用,實現了極高的效能。

圖片

  1. 2. 結構化日誌Zap支援結構化日誌記錄,方便將日誌資訊以鍵值對的方式記錄下來,對於日誌搜尋、分析和聚合很有幫助。

  2. 3. 日誌分級Zap支援不同的日誌級別,包括Debug,Info,Warn,Error等。Debug只在開發和調適階段啟用,在生產環境中使用會產生大量日誌影響效能。Info用於幫助瞭解系統的正常執行情況,Warn在生產環境中幫助提前發現和處理潛在問題。Error在生產環境中用於記錄立即處理的錯誤和異常。

Zap日誌庫中,有兩種主要的日誌記錄方式,分別是zap.Loggerzap.SugaredLoggerzap.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提供了簡便的方法使日誌更加易用。如InfowInfofInfow用於記錄帶有鍵值對的日誌資訊,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)
閱讀 277

相關文章