package logger import ( "os" "time" "github.com/spf13/viper" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) // Init 初始化日志(依赖配置文件已加载) func Init() { // 日志级别转换 level := zap.InfoLevel switch viper.GetString("logger.level") { case "debug": level = zap.DebugLevel case "warn": level = zap.WarnLevel case "error": level = zap.ErrorLevel } // 日志轮转配置(lumberjack) hook := lumberjack.Logger{ Filename: viper.GetString("logger.path") + "logs/app.log", // 日志文件路径 MaxSize: viper.GetInt("logger.max_size"), // 单个文件最大大小(MB) MaxBackups: viper.GetInt("logger.max_backup"), // 最大备份数 MaxAge: viper.GetInt("logger.max_age"), // 最大保留天数 Compress: true, // 是否压缩 } // 编码器配置 encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalLevelEncoder, // 日志级别大写(DEBUG/INFO) EncodeTime: customTimeEncoder, // 自定义时间格式 EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, // 精简调用者路径 } // 输出配置(控制台+文件) core := zapcore.NewTee( zapcore.NewCore(zapcore.NewConsoleEncoder(encoderConfig), zapcore.AddSync(os.Stdout), level), zapcore.NewCore(zapcore.NewJSONEncoder(encoderConfig), zapcore.AddSync(&hook), level), ) // 创建logger实例(开启调用者信息和堆栈跟踪) logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel)) zap.ReplaceGlobals(logger) zap.L().Info("✅ 日志初始化成功", zap.String("level", level.String())) } // customTimeEncoder 自定义时间格式 func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05.000")) }