Go 語(yǔ)言怎么使用 Zap 日志庫(kù)?
?1、介紹
我們?cè)谥暗奈恼轮薪榻B過(guò)標(biāo)準(zhǔn)庫(kù) log 包的使用方式,它雖然使用方便,但是它支持的功能比較簡(jiǎn)單。
本文我們介紹 uber 開(kāi)源的日志庫(kù) zap?,首先使用 Gin 框架構(gòu)建一個(gè) Web 應(yīng)用,然后通過(guò)在該 Web 應(yīng)用中記錄日志,來(lái)介紹 zap 的使用方式。
最后,我們?cè)偈褂瞄_(kāi)源的日志切割庫(kù) lumberjack,進(jìn)行日志切割。
2、使用 Gin 構(gòu)建一個(gè) Web 應(yīng)用
本文重點(diǎn)不是介紹 gin 框架的使用方式,所以我們僅使用 gin 框架構(gòu)建一個(gè)簡(jiǎn)單的 Web 應(yīng)用,代碼如下:
閱讀上面這段代碼,訪問(wèn) http://127.0.0.1:8080/ping?,返回結(jié)果是 {"message":"pong"}。
然后,我們使用 zap? 記錄 ping 函數(shù)的請(qǐng)求日志。
3、Gin 框架使用 zap 日志庫(kù)
Zap 支持兩種模式,分別是 SugaredLogger? 和 Logger?,其中 SugaredLogger? 模式比 Logger 模式執(zhí)行速度更快。
SugaredLogger 模式
使用 Zap 日志庫(kù),首先需要使用 New? 函數(shù)創(chuàng)建一個(gè) Logger,代碼如下:
使用 New? 函數(shù),接收一個(gè) zapcore.Core? 類型的參數(shù)和一個(gè) Option? 類型的可選參數(shù),返回一個(gè) *Logger。
其中 zap.Core? 類型的參數(shù),可以使用 NewCore? 函數(shù)創(chuàng)建,接收三個(gè)參數(shù),分別是 zapcore.Encoder? 類型,zapcore.WriteSyncer? 類型和 zapcore.LevelEnabler 類型,分別用于指定日志格式、日志路徑和日志級(jí)別。
其中 zapcore.Encoder? 類型的參數(shù),可以使用 NewProductionEncoderConfig 函數(shù)創(chuàng)建,返回一個(gè)用于生產(chǎn)環(huán)境的固定日志編碼配置。
我們可以修改任意配置選項(xiàng)的值。
其中 zapcore.WriteSyncer? 類型的參數(shù),可以使用 AddSync? 函數(shù)創(chuàng)建,該函數(shù)接收一個(gè) io.Writer 類型的參數(shù)。
其中 zapcore.LevelEnabler? 類型的參數(shù),可以使用 zapcore? 包定義的常量 zapcore.DebugLevel?,該常量是 zapcore.Level? 類型,并且 zapcore.Level? 類型實(shí)現(xiàn)了 zapcore.LevelEnabler 接口。
完整代碼:
運(yùn)行程序,執(zhí)行 curl http://127.0.0.1:8080/ping。
可以看到,生成的日志文件 xxx.log?,文件中是 json 格式的日志內(nèi)容,我們可以根據(jù)實(shí)際需求修改為其他格式。
開(kāi)發(fā)中,可能我們希望日志可以同時(shí)輸出到日志文件和終端中,可以使用函數(shù) NewMultiWriteSyncer,代碼如下:
除了使用 zap.New()? 創(chuàng)建 Logger? 之外,Zap 還提供了開(kāi)箱即用的三種創(chuàng)建 Logger? 的方式,分別是函數(shù) NewProduction,NewDevelopment? 和 Example(),感興趣的讀者朋友們,可以試用一下。
Logger 模式
接下來(lái),我們簡(jiǎn)單介紹一下 Logger? 模式,它主要用于性能和類型安全比較重要的場(chǎng)景中,但是,它沒(méi)有 SugaredLogger 模式簡(jiǎn)單易用,我們可以根據(jù)實(shí)際場(chǎng)景選擇使用哪種模式。
我們修改一下現(xiàn)有代碼,新創(chuàng)建 InitLoggerV2? 函數(shù),其中 enc,ws? 和 enab? 函數(shù)的代碼與 SugaredLogger 模式保持一致。
閱讀上面這段代碼,我們可以發(fā)現(xiàn),在使用 zap 記錄日志時(shí),我們需要顯示指定數(shù)據(jù)類型,一般用于性能和類型安全比較重要的場(chǎng)景中。
4、zap 日志庫(kù)使用 lumberjack 庫(kù)進(jìn)行日志切割
Zap 日志庫(kù)也不支持日志切割的功能,我們可以使用 lumberjack? 日志切割庫(kù)進(jìn)行日志切割,關(guān)于 lumberjack 庫(kù)的使用方式,我們?cè)谥暗奈恼陆榻B過(guò),此處不再重復(fù)介紹,直接上代碼:
lumberjack.Logger 的字段含義:
- Filename 日志保存文件路徑
- MaxSize 日志文件大小,單位是 MB
- MaxBackups 保留的日志文件數(shù)量
- MaxAge 日志文件的最長(zhǎng)保留時(shí)間,單位是天
- Compress 日志文件是否需要壓縮
5、總結(jié)
本文我們通過(guò)在 Gin 構(gòu)建的應(yīng)用中,使用 Zap 記錄請(qǐng)求日志,介紹了 Zap 的使用方式,最后還通過(guò) lumberjack 日志切割庫(kù)進(jìn)行切割日志。
參考資料:
- https://github.com/uber-go/zap
- https://pkg.go.dev/go.uber.org/zap