Golang zap 日志简单实用
zap Golang 第三方库记录日志
Zap 是非常快的、结构化的、分日志级别的Go日志库
功能简介
- 可以配置日志输入格式 JSON 和普通文本
- 可以配置日志输出位置 控制台 和 文件
- 可以配置日志级别 debug、info、warn、 error
安装
go get -u go.uber.org/zap
基本使用
logger, err := zap.NewProduction()
if err != nil {
}
logger.Info("logger zap 日志")
logger.Warn("logger zap 日志")
logger.Error("logger zap 日志")
// 输出结果 在控制台
{"level":"info","ts":1723087266.398946,"caller":"golang-templant/main.go:26","msg":"logger zap 日志"}
{"level":"warn","ts":1723087266.399047,"caller":"golang-templant/main.go:27","msg":"logger zap 日志"}
{"level":"error","ts":1723087266.399051,"caller":"golang-templant/main.go:28","msg":"logger zap 日志","stacktrace":"main.main\n\t/Users/wangjiaxin/workspace/GoLangProject/src/golang-templant/main.go:2nruntime.main\n\t/usr/local/go/src/runtime/proc.go:271"}
// level 日志等级 ts 时间戳 caller 文件名:行号 msg 日志内容
简单配置
// zai.New(Encoder, writeSyncer, level) Encode 编码格式 writeSyncer 输出位置 level 日志等级
// 1、encoder 输出格式
zapConfig := zap.NewProductionEncoderConfig()
zapConfig.TimeKey = "time"
zapConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
zapConfig.MessageKey = "message"
zapConfig.LevelKey = "日志级别"
encode := zapcore.NewJSONEncoder(zapConfig)
// 2、 日志写到指定位置
file, _ := os.OpenFile("./log.text", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
errorFile, _ := os.OpenFile("./error.text", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
write := zapcore.AddSync(file)
writeError := zapcore.AddSync(errorFile)
console := zapcore.AddSync(os.Stdout)
// 3、日志级别
// 写到单个指定位置
// 解析字符串 可以从配置文件中读取
level, err := zapcore.ParseLevel("info")
if err != nil {
level = zapcore.InfoLevel
}
// 写到多个指定位置
coreNew := zapcore.NewCore(encode, zapcore.NewMultiWriteSyncer(write, writeError, console), level)
// 在做日志封装的时候 使用zap.AddCallerSkip(1) 记录日志路径更准确
//logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
logger = zap.New(coreNew, zap.AddCaller())
logger.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int64("uid", 1))
logger.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int64("uid", 2))
logger.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int64("uid", 3))
logger.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int64("uid", 4))
// 记录不同日志级别到不同文件
core := zapcore.NewCore(encode, write, level)
coreError := zapcore.NewCore(encode, writeError, zapcore.ErrorLevel)
newCore := zapcore.NewTee(core, coreError)
newLogger := zap.New(newCore, zap.AddCaller())
newLogger.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int64("uid", 1))
newLogger.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int64("uid", 2))
newLogger.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int64("uid", 3))
newLogger.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int64("uid", 4))
// 日记文件切割
newEncode := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
writeFile := &lumberjack.Logger{
Filename: "./app.log.text", // 文件名
MaxSize: 10, // 文件大小 M
MaxBackups: 3, // 保留文件最大个数
MaxAge: 28, // 保存时间 天
Compress: false, // 是否压缩文件
LocalTime: true, // 是否使用本地时间
}
writeSyncFile := zapcore.AddSync(writeFile)
lCore := zapcore.NewCore(newEncode, writeSyncFile, zapcore.DebugLevel)
log := zap.New(lCore)
for i := 0; i < 100000; i++ {
log.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int("uid", i))
log.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int("uid", i))
log.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int("uid", i))
log.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int("uid", i))
}