package logger import ( "log" "os" "path/filepath" "sync" "time" ) // Logger 全局日志实例 var Logger *log.Logger var logFile *os.File var logFileName string var mu sync.Mutex // InitLogger 初始化日志,创建 /data/logs 目录并按天命名文件 func InitLogger() error { mu.Lock() defer mu.Unlock() // 创建 /data/logs 目录 logDir := "/data/logs" if err := os.MkdirAll(logDir, 0755); err != nil { return err } // 按天生成日志文件名:20260102.log logFileName = filepath.Join(logDir, time.Now().Format("20060102")+".log") file, err := os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err } logFile = file Logger = log.New(file, "", log.LstdFlags) // 每天凌晨检查是否需要切换日志文件 go func() { for { // 每天检查一次(凌晨 00:05 执行) now := time.Now() next := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 5, 0, 0, now.Location()) time.Sleep(time.Until(next)) mu.Lock() newFileName := filepath.Join(logDir, time.Now().Format("20060102")+".log") if newFileName != logFileName { newFile, err := os.OpenFile(newFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Printf("Failed to switch the log file: %v", err) mu.Unlock() continue } logFile.Close() logFile = newFile logFileName = newFileName Logger = log.New(newFile, "", log.LstdFlags) Logger.Println("The log file has been switched:", newFileName) } mu.Unlock() } }() return nil } // CloseLogger 关闭日志文件 func CloseLogger() { mu.Lock() defer mu.Unlock() if logFile != nil { logFile.Close() logFile = nil } } // CleanupOldLogs 删除超过30天的日志文件 func CleanupOldLogs() { logDir := "/data/logs" files, err := os.ReadDir(logDir) if err != nil { if Logger != nil { Logger.Printf("Read the log directory %s Error: %v", logDir, err) } return } const maxAge = 30 * 24 * time.Hour // 30天 for _, file := range files { if file.IsDir() { continue } info, err := file.Info() if err != nil { if Logger != nil { Logger.Printf("Obtain file information %s Error: %v", file.Name(), err) } continue } if time.Since(info.ModTime()) > maxAge { filePath := filepath.Join(logDir, file.Name()) if err := os.Remove(filePath); err != nil { if Logger != nil { Logger.Printf("Delete the old log files %s Error: %v", filePath, err) } } else { if Logger != nil { Logger.Printf("Delete the old log files %s succeed", filePath) } } } } }