package log import ( "fmt" "os" "path/filepath" "sentinel/pkg/config" "time" ) var logDir = "./logs" // 日志目录,可根据需要修改 // 初始化日志目录 func Init(dir string) { if dir != "" { logDir = dir } if err := os.MkdirAll(logDir, 0755); err != nil { fmt.Println("create log dir failed:", err) } go func() { ticker := time.NewTicker(config.LOG_CHECK_INTERVAL_HOURS * time.Hour) defer ticker.Stop() for range ticker.C { cleanupOldLogs() } }() } // Cleanup 删除超过7天的日志文件 func cleanupOldLogs() { files, err := os.ReadDir(logDir) if err != nil { return } cutoff := time.Now().AddDate(0, 0, -7) for _, f := range files { if f.IsDir() { continue } info, err := f.Info() if err != nil { continue } if info.ModTime().Before(cutoff) { _ = os.Remove(filepath.Join(logDir, f.Name())) } } } // log 内部写文件 func logToFile(level, msg string) { fmt.Println(msg) t := time.Now() // 确保日志目录存在 if err := os.MkdirAll(logDir, 0755); err != nil { fmt.Println("create log dir failed:", err) return } filename := filepath.Join(logDir, t.Format("2006-01-02")+".log") f, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { fmt.Println("open log file failed:", err) return } defer f.Close() line := fmt.Sprintf("%s [%s] %s\n", t.Format("2006-01-02 15:04:05"), level, msg) _, _ = f.WriteString(line) } // 对外接口 func Info(msg string) { logToFile("INFO", msg) } // Println 支持多个参数拼接,写 INFO 日志 func Println(v ...interface{}) { msg := fmt.Sprint(v...) logToFile("INFO", msg) } func Debug(v ...interface{}) { //msg := fmt.Sprint(v...) //logToFile("DEBUF", msg) } func Warn(msg string) { logToFile("WARN", msg) } func Error(msg string) { logToFile("ERROR", msg) } func Fatal(err error) { if err == nil { return } logToFile("ERROR", err.Error()) } // Fatal 打印错误日志并退出程序 func Fatalf(msg string, args ...interface{}) { if len(args) > 0 { msg = fmt.Sprintf(msg, args...) } logToFile("FATAL", msg) os.Exit(1) }