You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.1 KiB
70 lines
2.1 KiB
package util
|
|
|
|
import (
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
// 初始化生产级日志器
|
|
func NewProductionLogger() *zap.Logger {
|
|
// 1. 配置日志轮转(用lumberjack)
|
|
hook := &lumberjack.Logger{
|
|
|
|
Filename: "./logs/app.log", // 日志文件路径
|
|
MaxSize: 10, // 单个文件最大大小(MB)
|
|
MaxBackups: 7, // 最多保留多少个备份文件
|
|
MaxAge: 7, // 日志文件最多保留多少天
|
|
Compress: true, // 是否压缩备份文件(gzip)
|
|
}
|
|
defer hook.Close()
|
|
|
|
// 2. 设置日志输出格式
|
|
// 时间格式:2024-05-20 09:30:00.123
|
|
timeFormat := "2006-01-02 15:04:05.000"
|
|
encoderConfig := zapcore.EncoderConfig{
|
|
TimeKey: "ts",
|
|
LevelKey: "level",
|
|
NameKey: "logger",
|
|
CallerKey: "caller",
|
|
MessageKey: "msg",
|
|
StacktraceKey: "stacktrace",
|
|
LineEnding: zapcore.DefaultLineEnding,
|
|
EncodeLevel: zapcore.CapitalLevelEncoder, // 级别用大写(INFO、ERROR)
|
|
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
|
|
enc.AppendString(t.Format(timeFormat))
|
|
},
|
|
EncodeDuration: zapcore.SecondsDurationEncoder,
|
|
EncodeCaller: zapcore.ShortCallerEncoder, // 调用者信息简化(main/main.go:20)
|
|
}
|
|
|
|
// 3. 配置日志级别和输出目标
|
|
// 输出目标:同时打印到控制台和文件
|
|
core := zapcore.NewCore(
|
|
zapcore.NewJSONEncoder(encoderConfig), // JSON格式
|
|
zapcore.NewMultiWriteSyncer(
|
|
zapcore.AddSync(hook), // 写入文件
|
|
//zapcore.AddSync(zapcore.Lock(os.Stdout)), // 打印到控制台
|
|
),
|
|
zapcore.InfoLevel, // 生产环境只打印Info及以上级别
|
|
)
|
|
|
|
// 4. 开启调用者信息和堆栈跟踪
|
|
logger := zap.New(core,
|
|
zap.AddCaller(), // 显示日志调用的文件和行号
|
|
zap.AddStacktrace(zapcore.ErrorLevel), // 只有Error及以上级别才显示堆栈
|
|
)
|
|
|
|
return logger
|
|
}
|
|
|
|
// 根据环境初始化日志器
|
|
func InitLogger(env string) *zap.Logger {
|
|
if env == "dev" {
|
|
logger, _ := zap.NewDevelopment()
|
|
return logger
|
|
}
|
|
return NewProductionLogger()
|
|
}
|
|
|