package logger import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) var Logger *zap.Logger // atomicLevel 持有当前生效的日志级别,支持在配置加载完成后动态调整(无需重建 Logger) var atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel) func Init() error { config := zap.NewProductionConfig() config.OutputPaths = []string{"stdout"} config.ErrorOutputPaths = []string{"stderr"} // 配置日志轮换 lumberJackLogger := &lumberjack.Logger{ Filename: "logs/app.log", MaxSize: 10, // MB MaxBackups: 3, MaxAge: 30, // days Compress: true, } // 创建写入器 w := zapcore.AddSync(lumberJackLogger) // 创建编码器配置 encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.TimeKey = "time" encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05") encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder encoderConfig.MessageKey = "msg" encoderConfig.CallerKey = "caller" // 创建控制台编码器(文本格式) encoder := zapcore.NewConsoleEncoder(encoderConfig) // 创建核心 core := zapcore.NewCore(encoder, w, atomicLevel) // 创建日志记录器 Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)) return nil } // SetLevel 动态调整日志级别,可在配置文件加载完成后调用(例如开启 debug 日志排查问题)。 // levelStr 支持 debug/info/warn/error 等,为空或非法值时保持当前级别不变并返回错误。 func SetLevel(levelStr string) error { if levelStr == "" { return nil } var level zapcore.Level if err := level.UnmarshalText([]byte(levelStr)); err != nil { return err } atomicLevel.SetLevel(level) return nil } func Info(message string, fields ...zap.Field) { Logger.Info(message, fields...) } func Error(message string, fields ...zap.Field) { Logger.Error(message, fields...) } func Warn(message string, fields ...zap.Field) { Logger.Warn(message, fields...) } func Debug(message string, fields ...zap.Field) { Logger.Debug(message, fields...) } func Fatal(message string, fields ...zap.Field) { Logger.Fatal(message, fields...) } func Sync() error { return Logger.Sync() }