1.前言
zap 是我個人比較喜歡的日誌庫,是 uber 開源的,有較好的性能。很多開源 Go 項目都使用它作爲日誌組件。
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"))
}
自定義日誌級別顯示
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()
,不然會造成丟失日誌。
效果