Go 使用 zap 日誌庫

1.前言

zap 是我個人比較喜歡的日誌庫,是 uber 開源的,有較好的性能。很多開源 Go 項目都使用它作爲日誌組件。

image-20220929153104876

2.安裝使用

安裝

go get -u go.uber.org/zap

快速入門

logger, _ := zap.NewProduction()
defer logger.Sync() // flushes buffer, if any
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
  // Structured context as loosely typed key-value pairs.
  "url", url,
  "attempt", 3,
  "backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)

3.進階

這裏介紹一些我常用的配置方式。

自定義時間格式

customTimeEncoder := func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}

image-20220929153402709

自定義日誌級別顯示

customLevelEncoder := func(level zapcore.Level, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(level.CapitalString())
}

自定義代碼路徑、行號輸出

customCallerEncoder := func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {
		enc.AppendString("[" + caller.TrimmedPath() + "]")
}

構建配置

zapLoggerEncoderConfig := zapcore.EncoderConfig{
	TimeKey:          "time",
	LevelKey:         "level",
	NameKey:          "logger",
	CallerKey:        "caller",
	MessageKey:       "message",
	StacktraceKey:    "stacktrace",
	EncodeCaller:     customCallerEncoder,
	EncodeTime:       customTimeEncoder,
	EncodeLevel:      customLevelEncoder,
	EncodeDuration:   zapcore.SecondsDurationEncoder,
	LineEnding:       "\n",
	ConsoleSeparator: " ",
}

控制檯輸出配置(帶顏色)

zapLoggerEncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))

輸出到文件

syncWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&lumberjack.Logger{
	Filename:  "logs/app/app.log", // ⽇志⽂件路徑
	MaxSize:   100,                                                     // 單位爲MB,默認爲512MB
	MaxAge:    5,                                                       // 文件最多保存多少天
	LocalTime: true,                                                    // 採用本地時間
	Compress:  false,                                                   // 是否壓縮日誌
}))

lumberjack 需要自己安裝 go get gopkg.in/natefinch/lumberjack.v2

異步輸出到文件

syncWriter = &zapcore.BufferedWriteSyncer{
	WS: zapcore.AddSync(&lumberjack.Logger{
		Filename:  "logs/app/app.log", // ⽇志⽂件路徑
		MaxSize:   100,                                                                                                        // 單位爲MB,默認爲512MB
		MaxAge:    5,                                                                                                          // 文件最多保存多少天
		LocalTime: true,                                                                                                       // 採用本地時間
		Compress:  false,                                                                                                      // 是否壓縮日誌
	}),
	Size: 4096,
}

構建 logger

zapCore := zapcore.NewCore(zapcore.NewConsoleEncoder(zapLoggerEncoderConfig), syncWriter, level)
zapLogger = zap.New(zapCore, zap.AddCaller(), zap.AddCallerSkip(1))

記得在程序退出時調用 zapLogger.Sync(),不然會造成丟失日誌。

效果

image-20220929154425738

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章