package logger import ( "io" "os" "sync" "github.com/sirupsen/logrus" ) var ( log *logrus.Logger logMutex sync.Mutex initialized bool ) // InitLogger 初始化日志系统 func InitLogger(logFile, level string, maxSize, maxBackups, maxAge int) error { logMutex.Lock() defer logMutex.Unlock() if initialized { return nil } log = logrus.New() // 配置日志格式 log.SetFormatter(&logrus.TextFormatter{ FullTimestamp: true, }) // 设置输出目标 if logFile != "" { // 使用标准库打开文件,支持追加写入 file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { logrus.Warn("无法打开日志文件,将使用标准输出", "error", err) log.SetOutput(os.Stdout) } else { // 同时输出到文件和标准输出 log.SetOutput(io.MultiWriter(file, os.Stdout)) } } else { log.SetOutput(os.Stdout) } // 设置日志级别 logLevel, err := logrus.ParseLevel(level) if err != nil { logLevel = logrus.InfoLevel } log.SetLevel(logLevel) initialized = true return nil } // Close 关闭日志系统 func Close() { logMutex.Lock() defer logMutex.Unlock() if !initialized { return } // 执行日志刷新 log.Warn("日志系统已关闭") initialized = false } // Info 记录信息级别日志 func Info(msg string, fields ...interface{}) { if !initialized { return } if len(fields) > 0 { log.WithFields(toFields(fields)).Info(msg) } else { log.Info(msg) } } // Error 记录错误级别日志 func Error(msg string, fields ...interface{}) { if !initialized { return } if len(fields) > 0 { log.WithFields(toFields(fields)).Error(msg) } else { log.Error(msg) } } // Debug 记录调试级别日志 func Debug(msg string, fields ...interface{}) { if !initialized { return } if len(fields) > 0 { log.WithFields(toFields(fields)).Debug(msg) } else { log.Debug(msg) } } // Warn 记录警告级别日志 func Warn(msg string, fields ...interface{}) { if !initialized { return } if len(fields) > 0 { log.WithFields(toFields(fields)).Warn(msg) } else { log.Warn(msg) } } // toFields 将键值对转换为logrus字段 func toFields(keyValues []interface{}) logrus.Fields { fields := make(logrus.Fields) for i := 0; i < len(keyValues); i += 2 { if i+1 < len(keyValues) { fields[keyValues[i].(string)] = keyValues[i+1] } } return fields }