国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 語言怎么使用 Zap 日志庫?

開發(fā) 前端
本文我們通過在 Gin 構(gòu)建的應(yīng)用中,使用 Zap 記錄請求日志,介紹了 Zap 的使用方式,最后還通過 lumberjack 日志切割庫進(jìn)行切割日志。

?1、介紹

我們在之前的文章中介紹過標(biāo)準(zhǔn)庫 log 包的使用方式,它雖然使用方便,但是它支持的功能比較簡單。

本文我們介紹 uber 開源的日志庫 zap?,首先使用 Gin 框架構(gòu)建一個 Web 應(yīng)用,然后通過在該 Web 應(yīng)用中記錄日志,來介紹 zap 的使用方式。

最后,我們再使用開源的日志切割庫 lumberjack,進(jìn)行日志切割。

2、使用 Gin 構(gòu)建一個 Web 應(yīng)用

本文重點(diǎn)不是介紹 gin 框架的使用方式,所以我們僅使用 gin 框架構(gòu)建一個簡單的 Web 應(yīng)用,代碼如下:

func main() {
r := gin.Default()
r.GET("/ping", ping)
r.Run()
}

func ping(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
}

閱讀上面這段代碼,訪問 http://127.0.0.1:8080/ping?,返回結(jié)果是 {"message":"pong"}。

然后,我們使用 zap? 記錄 ping 函數(shù)的請求日志。

3、Gin 框架使用 zap 日志庫

Zap 支持兩種模式,分別是 SugaredLogger? 和 Logger?,其中 SugaredLogger? 模式比 Logger 模式執(zhí)行速度更快。

SugaredLogger 模式

使用 Zap 日志庫,首先需要使用 New? 函數(shù)創(chuàng)建一個 Logger,代碼如下:

func New(core zapcore.Core, options ...Option) *Logger

使用 New? 函數(shù),接收一個 zapcore.Core? 類型的參數(shù)和一個 Option? 類型的可選參數(shù),返回一個 *Logger。

其中 zap.Core? 類型的參數(shù),可以使用 NewCore? 函數(shù)創(chuàng)建,接收三個參數(shù),分別是 zapcore.Encoder? 類型,zapcore.WriteSyncer? 類型和 zapcore.LevelEnabler 類型,分別用于指定日志格式、日志路徑和日志級別。

func NewCore(enc Encoder, ws WriteSyncer, enab LevelEnabler) Core

其中 zapcore.Encoder? 類型的參數(shù),可以使用 NewProductionEncoderConfig 函數(shù)創(chuàng)建,返回一個用于生產(chǎn)環(huán)境的固定日志編碼配置。

// NewProductionEncoderConfig returns an opinionated EncoderConfig for
// production environments.
func NewProductionEncoderConfig() zapcore.EncoderConfig {
return zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.EpochTimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
}

我們可以修改任意配置選項(xiàng)的值。

其中 zapcore.WriteSyncer? 類型的參數(shù),可以使用 AddSync? 函數(shù)創(chuàng)建,該函數(shù)接收一個 io.Writer 類型的參數(shù)。

func AddSync(w io.Writer) WriteSyncer

其中 zapcore.LevelEnabler? 類型的參數(shù),可以使用 zapcore? 包定義的常量 zapcore.DebugLevel?,該常量是 zapcore.Level? 類型,并且 zapcore.Level? 類型實(shí)現(xiàn)了 zapcore.LevelEnabler 接口。

完整代碼:

var sugaredLogger *zap.SugaredLogger

func main() {
InitLogger()
defer sugaredLogger.Sync()
r := gin.Default()
r.GET("/ping", ping)
r.Run()
}

func ping(c *gin.Context) {
sugaredLogger.Debug("call func ping")
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
}

func InitLogger() {
core := zapcore.NewCore(enc(), ws(), enab())
logger := zap.New(core)
sugaredLogger = logger.Sugar()
}

func enc() zapcore.Encoder {
cfg := zap.NewProductionEncoderConfig()
cfg.TimeKey = "time"
cfg.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
return zapcore.NewJSONEncoder(cfg)
}

func ws() zapcore.WriteSyncer {
logFileName := fmt.Sprintf("./%v.log", time.Now().Format("2006-01-02"))
logFile, err := os.Create(logFileName)
if err != nil {
log.Fatal(err)
}
return zapcore.AddSync(logFile)
}

func enab() zapcore.LevelEnabler {
return zapcore.DebugLevel
}

運(yùn)行程序,執(zhí)行 curl http://127.0.0.1:8080/ping。

可以看到,生成的日志文件 xxx.log?,文件中是 json 格式的日志內(nèi)容,我們可以根據(jù)實(shí)際需求修改為其他格式。

開發(fā)中,可能我們希望日志可以同時(shí)輸出到日志文件和終端中,可以使用函數(shù) NewMultiWriteSyncer,代碼如下:

func wsV2() zapcore.WriteSyncer {
return zapcore.NewMultiWriteSyncer(ws(), zapcore.AddSync(os.Stdout))
}

除了使用 zap.New()? 創(chuàng)建 Logger? 之外,Zap 還提供了開箱即用的三種創(chuàng)建 Logger? 的方式,分別是函數(shù) NewProduction,NewDevelopment? 和 Example(),感興趣的讀者朋友們,可以試用一下。

Logger 模式

接下來,我們簡單介紹一下 Logger? 模式,它主要用于性能和類型安全比較重要的場景中,但是,它沒有 SugaredLogger 模式簡單易用,我們可以根據(jù)實(shí)際場景選擇使用哪種模式。

我們修改一下現(xiàn)有代碼,新創(chuàng)建 InitLoggerV2? 函數(shù),其中 enc,ws? 和 enab? 函數(shù)的代碼與 SugaredLogger 模式保持一致。

var loggerV2 *zap.Logger

func main() {
InitLoggerV2()
defer loggerV2.Sync()
r := gin.Default()
r.GET("/ping", ping)
r.Run()
}

func ping(c *gin.Context) {
loggerV2.Debug("call func ping", zap.Int("code", 200))
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
}

func InitLoggerV2() {
core := zapcore.NewCore(enc(), ws(), enab())
loggerV2 = zap.New(core)
}

閱讀上面這段代碼,我們可以發(fā)現(xiàn),在使用 zap 記錄日志時(shí),我們需要顯示指定數(shù)據(jù)類型,一般用于性能和類型安全比較重要的場景中。

4、zap 日志庫使用 lumberjack 庫進(jìn)行日志切割

Zap 日志庫也不支持日志切割的功能,我們可以使用 lumberjack? 日志切割庫進(jìn)行日志切割,關(guān)于 lumberjack 庫的使用方式,我們在之前的文章介紹過,此處不再重復(fù)介紹,直接上代碼:

func wsV3() zapcore.WriteSyncer {
logFileName := fmt.Sprintf("./%v.log", time.Now().Format("2006-01-02"))
lumberjackLogger := &lumberjack.Logger{
Filename: logFileName,
MaxSize: 1,
MaxBackups: 3,
MaxAge: 28,
Compress: false,
}
return zapcore.AddSync(lumberjackLogger)
}

lumberjack.Logger 的字段含義:

  • Filename 日志保存文件路徑
  • MaxSize 日志文件大小,單位是 MB
  • MaxBackups 保留的日志文件數(shù)量
  • MaxAge 日志文件的最長保留時(shí)間,單位是天
  • Compress 日志文件是否需要壓縮

5、總結(jié)

本文我們通過在 Gin 構(gòu)建的應(yīng)用中,使用 Zap 記錄請求日志,介紹了 Zap 的使用方式,最后還通過 lumberjack 日志切割庫進(jìn)行切割日志。

參考資料:

  1. https://github.com/uber-go/zap
  2. https://pkg.go.dev/go.uber.org/zap
責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2024-02-01 13:30:53

Go語言開發(fā)

2023-02-26 23:49:17

Go語言監(jiān)聽庫

2022-06-05 23:30:25

AES加密算法

2023-07-28 09:26:43

GolangZap

2023-04-18 08:27:16

日志級別日志包

2024-04-01 00:02:56

Go語言代碼

2022-07-03 23:07:48

Go語言參數(shù)

2022-04-13 08:20:32

DockerGo項(xiàng)目

2022-07-04 14:41:31

Go 語言變長參數(shù)變長參數(shù)函數(shù)

2022-05-31 08:53:29

Logger定制化Go

2023-09-26 00:57:49

Go語言日志庫

2023-01-16 00:12:20

Go語言Web

2023-07-16 23:43:05

Go語言模式

2022-10-24 00:48:58

Go語言errgroup

2023-04-02 23:13:07

Go語言bufio

2021-10-18 10:53:26

Go 代碼技術(shù)

2024-10-28 00:40:49

Go語法版本

2018-03-12 22:13:46

GO語言編程軟件

2024-01-02 10:38:22

Go語言數(shù)組

2021-07-28 07:53:21

Go語言拷貝
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

性欧美videos高清hd4k| 亚洲国产精品999| 欧美性猛交99久久久久99按摩| 欧美在线观看一区| 日韩精品视频观看| 色爱综合网站| 一区视频网站| 欧美韩日一区二区三区| 欧美不卡视频一区| 国产91网红主播在线观看| 国产精品第12页| 欧美性感美女一区二区| 国产黄色激情视频| 国产不卡在线| 国产乱子轮精品视频| 无码av中文一区二区三区桃花岛| 欧美亚洲另类视频| 飘雪影视在线观看免费观看| 蜜乳av一区二区| 欧美性在线观看| 国产精欧美一区二区三区蓝颜男同| 亚洲一区二区三区四区在线| 热99这里只有精品| 美日韩一级片在线观看| 欧美日韩国产高清视频| 亚洲不卡av不卡一区二区| 日韩免费观看视频| 亚州综合一区| 欧美精品成人91久久久久久久| 国模套图日韩精品一区二区| 日韩西西人体444www| 丁香花电影在线观看完整版| 精品久久久久久久人人人人传媒| av影院在线免费观看| 国产亚洲欧洲在线| 成人性生交大片免费看96| 国产福利成人在线| 亚洲美女91| av高清在线免费观看| 亚洲三级电影网站| √天堂8资源中文在线| 欧美激情一级二级| 欧美好骚综合网| 法国空姐在线观看免费| 亚洲欧美综合另类在线卡通| 日漫免费在线观看网站| 亚洲欧洲午夜一线一品| 欧美日韩爱爱| 国产精品视频二| 性久久久久久久| 日韩电影免费观| 国产精品免费在线免费 | 午夜精品偷拍| 欧美午夜小视频| 欧美一区二区三区四区五区| 亚洲综合网狠久久| 欧洲在线视频一区| 午夜亚洲国产au精品一区二区| av影院在线免费观看| 国产欧美韩国高清| 国产欧美日韩精品一区| 波多野结衣在线观看| 91精品视频大全| 国产精品福利电影一区二区三区四区| av中文字幕在线| 国产精品扒开腿做爽爽爽视频| 成人性生交大片免费| 污视频网站在线免费| 99在线视频首页| 亚洲精品videosex极品| 人人爱人人干婷婷丁香亚洲| 亚洲成人动漫在线| 国产视频久久网| 免费成人性网站| 久久丝袜视频| 国产精品二区三区四区| 欧美日韩亚洲一区在线观看| 国产精品一区二区久久| 欧美日韩免费观看一区=区三区| 黄色av网址在线播放| 亚洲欧美日韩精品久久亚洲区 | 国产精品第十页| 久草福利在线视频| 成人久久久久爱| 欧美日韩夫妻久久| 日韩av一区二| 黑人巨大精品| 91在线观看高清| 色婷婷综合久久久中字幕精品久久| 欧美高清性xxxxhdvideosex| 欧美天堂一区二区三区| 亚洲综合不卡| 精品91久久| 中文字幕网av| 成人天堂噜噜噜| 欧美视频一区在线| 国产精品自拍在线| 久久中文资源| 亚洲成人三级| 欧美日韩黄色一级片| 国产精品成人av在线| 色狠狠色狠狠综合| 国内精品国产成人| 加勒比视频一区| 97视频精彩视频在线观看| 一级二级三级欧美| 2025国产精品视频| 4hu四虎永久在线影院成人| 国产馆精品极品| 欧美理论视频| 欧美片第一页| 精品亚洲成a人片在线观看| 99视频在线视频| 亚洲人成电影在线播放| 国产亚av手机在线观看| 亚洲女同精品视频| 亚洲猫色日本管| 蜜臀久久99精品久久久画质超高清| 麻豆精品少妇| 91p九色成人| 3p在线观看| 最近中文字幕mv2018在线高清 | 日本午夜精品理论片a级appf发布| 91精品国产福利| 亚洲曰韩产成在线| 国产日韩欧美a| 一本色道久久加勒比88综合| 久久99精品久久久久久久青青日本 | 亚洲激情自拍偷拍| 成人综合在线网站| 日本不卡的三区四区五区| 欧美一区二区三区高清视频| 在线观看欧美| 成人h在线观看| 国产成人高清精品| 中文日本在线观看| 亚洲成人基地| 台湾av在线二三区观看| 播九公社成人综合网站| 噼里啪啦国语在线观看免费版高清版| 一本一道久久久a久久久精品91| 欧美日韩国产三区| 快播日韩欧美| 波多野结衣三级在线| 久久久成人精品一区二区三区| 视频一区二区三区免费观看| 亚洲精品中文字幕在线| 老司机午夜网站| 黄页免费在线观看视频| 欧美激情国产精品日韩| wwwxxx黄色片| 日本视频三区| 五月婷婷在线视频| cao在线视频| 成人性生交大片免费看中文视频| 乱亲女h秽乱长久久久| 精品免费av| 日日夜夜精品免费视频| 国产成人99久久亚洲综合精品| 国产精品无码永久免费888| 亚洲卡通欧美制服中文| 欧美日韩免费视频| 久久精品亚洲一区| 91精品国产综合久久香蕉最新版| 岛国一区二区三区高清视频| 亚洲自拍三区| 精品美女国产在线| 国产香蕉精品视频一区二区三区| 久久免费国产视频| 久久精品丝袜高跟鞋| 欧美亚洲日本在线观看| 日韩黄色动漫| 亚洲男人av| 综合国产在线| 国产亚洲女人久久久久毛片| 欧美撒尿777hd撒尿| 久久夜色精品国产| 神马一区二区影院| 在线观看h网址| 97久久综合区小说区图片区| 麻豆91在线播放| 日韩欧美国产激情| 不卡大黄网站免费看| 欧美午夜久久| 日韩视频网站在线观看| 亚洲成av人片在线观看www| 欧美精品观看| 色综合久久久久久久久久久| 97久久久久久| 午夜精品久久久久久久无码| 蜜桃av在线| 美女网站色91| 亚洲国产日韩欧美综合久久| 麻豆av一区| 国产激情小视频在线| 欧美性色综合| 欧美日韩在线播放三区四区| 福利精品视频| av基地在线| 日韩综合小视频|