package logging import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" ) // Logger 全局日志实例 var Logger *zap.Logger // Config 日志配置 type Config struct { Level string `json:"level"` Format string `json:"format"` Output string `json:"output"` MaxSize int `json:"max_size"` MaxBackups int `json:"max_backups"` MaxAge int `json:"max_age"` } // Init 初始化日志系统 func Init(cfg Config) error { // 解析日志级别 level := zap.NewAtomicLevel() switch cfg.Level { case "debug": level.SetLevel(zap.DebugLevel) case "info": level.SetLevel(zap.InfoLevel) case "warn": level.SetLevel(zap.WarnLevel) case "error": level.SetLevel(zap.ErrorLevel) default: level.SetLevel(zap.InfoLevel) } // 配置编码器 var encoder zapcore.Encoder encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.TimeKey = "time" encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.CallerKey = "caller" encoderConfig.MessageKey = "message" encoderConfig.LevelKey = "level" if cfg.Format == "console" { encoder = zapcore.NewConsoleEncoder(encoderConfig) } else { encoder = zapcore.NewJSONEncoder(encoderConfig) } // 配置输出 var writeSyncer zapcore.WriteSyncer if cfg.Output != "" { // 使用文件轮转 lumberJackLogger := &lumberjack.Logger{ Filename: cfg.Output, MaxSize: cfg.MaxSize, MaxBackups: cfg.MaxBackups, MaxAge: cfg.MaxAge, Compress: true, LocalTime: true, } writeSyncer = zapcore.AddSync(lumberJackLogger) } else { writeSyncer = zapcore.AddSync(os.Stdout) } // 创建核心 core := zapcore.NewCore(encoder, writeSyncer, level) // 创建 logger Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel)) return nil } // GetLogger 获取日志实例 func GetLogger() *zap.Logger { if Logger == nil { // 如果未初始化,返回一个默认的 stdout logger Logger, _ = zap.NewDevelopment() } return Logger } // Sync 刷新日志缓冲 func Sync() error { if Logger != nil { return Logger.Sync() } return nil }