zap+lumberjack
日志记录+日志切割2件套
包地址
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
zap核心概念
- 日志级别:
DebugLevel
: 调试信息。InfoLevel
: 一般信息。WarnLevel
: 警告信息。ErrorLevel
: 错误信息。DPanicLevel
: 开发时恐慌(不会在正式环境生效)。PanicLevel
: 恐慌,会触发panic。FatalLevel
: 致命错误,记录日志后调用os.Exit(1)。
- 日志字段:
- Zap使用字段来结构化日志记录。每个字段都有一个键和一个值。
- Logger和SugaredLogger:
Logger
: 提供结构化日志记录,并且性能较高,但是编写起来可能不太方便,因为需要指定字段类型。SugaredLogger
: 提供更方便的日志记录方式,类似于传统的日志库,但性能略低于Logger
。
将2件套做成日志工具包
package utils
import (
"time"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func InitLogger() *zap.SugaredLogger {
logWriter := &lumberjack.Logger{
Filename: "./cmd/运行日志.log",
MaxSize: 10, // 日志文件空间限制(MB)
MaxBackups: 3, //保留的最大备份文件数量
MaxAge: 7, // 保留日期,过期后自动删除
Compress: true, //旧的日志文件在滚动时是否压缩
}
encoderConfig := zapcore.EncoderConfig{
MessageKey: "message", //消息内容的键名
LevelKey: "level", //日志级别的键名
TimeKey: "time", //时间的键名
EncodeLevel: zapcore.CapitalLevelEncoder, //日志级别的编码方式,编码为大写字母(如INFO, ERROR等)
EncodeTime: customTimeEncoder, //时间的编码方式
EncodeDuration: zapcore.StringDurationEncoder, //持续时间(如操作耗时)的编码方式
EncodeCaller: zapcore.ShortCallerEncoder, //将持续时间编码为字符串
}
core := zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig), //指定调用者信息的编码方式,通常是文件名和行号
zapcore.AddSync(logWriter), //将日志写入器添加到日志核心,以便日志可以被写入到文件中。
zap.InfoLevel, //日志记录的初始级别。当前记录INFO及以上级别的日志。
)
logger := zap.New(core)
return logger.Sugar()
}
// 自定义时间编码器,以中国时区格式化时间
func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
enc.AppendString(t.In(time.FixedZone("UTC+8", 8*3600)).Format("2006-01-02 15:04:05 MST"))
}
调用日志工具包
进行日志记录和日志切割
package main
import (
"KazeFrame/utils"
)
func main() {
// 初始化日志器
logger := utils.InitLogger()
// 使用日志器记录信息
logger.Info("程序启动")
logger.Infof("当前时间: %s", time.Now().String())
// 其他应用程序逻辑...
}