package util import ( "os" "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: 100, // 单个文件最大大小(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 }