Go的日志库 zap
1.安装
go get -u go.uber.org/zap
2.基本使用
默认json格式
-
Logger
package main import "go.uber.org/zap" func main() { logger, err := zap.NewProduction() if err != nil { panic(err) } var uid int64 = 66666 data := []int{1, 2, 3} logger.Info( "日志信息", zap.Int64("uid", uid), zap.Bool("isLogin", true), zap.String("name", "mkl"), zap.Any("data", data), /** { "level":"info", "ts":1654522205.109878, "caller":"zap/main.go:13", "msg":"日志信息", "uid":66666, "isLogin":true, "name":"mkl", "data":[1,2,3] } */ ) }
-
Sugar
package main import "go.uber.org/zap" func main() { logger, err := zap.NewProduction() if err != nil { panic(err) } sLogger := logger.Sugar() var uid int64 = 6666 name := "mkl" sLogger.Infof( "记录日志, %v, %v", uid, name, ) }
3.配置
-
自定义输出方式
encoder/writer/level
package main import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func main() { // 定制zap日志对象 encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()) file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) fileWS := zapcore.AddSync(file) consoleWS := zapcore.AddSync(os.Stdout) // zapcore.Core: // Encoder: 编码 // WriteSyncer: 写文件对象 // LogLevel: 级别(生产环境不需要记录debug级别日志) s := "info" // 从配置文件读取一个日志级别 level, err := zapcore.ParseLevel(s) if err != nil { level = zapcore.InfoLevel } core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level) logger := zap.New(core) logger.Info("输出日志.") }
-
配置时间格式
package main import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // initLogger 日志对象初始化 func initLogger() *zap.Logger { // 配置时间 zap.NewProduction() 默认会在日志中记录调用信息 encoderCfg := zap.NewProductionEncoderConfig() encoderCfg.TimeKey = "time" encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别 encoder := zapcore.NewJSONEncoder(encoderCfg) file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) fileWS := zapcore.AddSync(file) consoleWS := zapcore.AddSync(os.Stdout) s := "info" // 从配置文件读取一个日志级别 level, err := zapcore.ParseLevel(s) if err != nil { level = zapcore.InfoLevel } core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level) logger := zap.New(core, zap.AddCaller()) // 添加调用信息 return logger } func main() { logger := initLogger() logger.Info("输出日志.") }
4.输出不同级别的日志在不同文件中
package main
import (
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// initLogger 日志对象初始化
func initLogger() *zap.Logger {
// 配置时间 zap.NewProduction() 默认会在日志中记录调用信息
encoderCfg := zap.NewProductionEncoderConfig()
encoderCfg.TimeKey = "time"
encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别
encoder := zapcore.NewJSONEncoder(encoderCfg)
logFile1, _ := os.Create("./app.log")
core1 := zapcore.NewCore(encoder, zapcore.AddSync(logFile1), zapcore.InfoLevel)
logFile2, _ := os.Create("./app.err.log")
core2 := zapcore.NewCore(encoder, zapcore.AddSync(logFile2), zapcore.ErrorLevel)
newCore := zapcore.NewTee(core1, core2)
logger := zap.New(newCore, zap.AddCaller()) // 添加调用信息
return logger
}
func main() {
logger := initLogger()
logger.Info("输出日志.")
}
5.日志切割
通过第三方Lumberjack实现日志切割
package main
import (
"os"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// initLogger 日志对象初始化
func initLogger() *zap.Logger {
// 配置时间 zap.NewProduction() 默认会在日志中记录调用信息
encoderCfg := zap.NewProductionEncoderConfig()
encoderCfg.TimeKey = "time"
encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别
encoder := zapcore.NewJSONEncoder(encoderCfg)
file := &lumberjack.Logger{
Filename: "./test.log", // 日志的位置
MaxSize: 10, // 日志最大大小
MaxBackups: 5, // 保留文件最大数
MaxAge: 30, // 保留最大天数
Compress: false, // 是否压缩文件
}
// file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
fileWS := zapcore.AddSync(file)
consoleWS := zapcore.AddSync(os.Stdout)
s := "info" // 从配置文件读取一个日志级别
level, err := zapcore.ParseLevel(s)
if err != nil {
level = zapcore.InfoLevel
}
core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level)
logger := zap.New(core, zap.AddCaller()) // 添加调用信息
return logger
}
func main() {
logger := initLogger()
logger.Info("输出日志.")
}
记录自己的学习历程!