package main import ( "os" "path/filepath" "sort" "strings" "time" "lc/common/util" ) const ( logRetentionDays = 7 logMaxTotalSize = 100 * 1024 * 1024 // 100MB ) type logFileInfo struct { name string size int64 modTime time.Time } // removeLogFile 删除单个日志文件并返回释放的字节数 func removeLogFile(dir string, f logFileInfo) (bool, int64) { path := filepath.Join(dir, f.name) if err := os.Remove(path); err != nil { util.GetTagLog().Warnf("sys", "CleanLogs:删除失败:%s,err=%v", f.name, err) return false, 0 } return true, f.size } // CleanLogs 定时清理日志文件:保留7天,总大小不超过100MB func CleanLogs(args ...interface{}) interface{} { for { time.Sleep(1 * time.Hour) dir := util.GetPath(3) // {workdir}/log/ entries, err := os.ReadDir(dir) if err != nil { util.GetTagLog().Warnf("sys", "CleanLogs:读取日志目录失败:%s", err) continue } var logFiles []logFileInfo var totalSize int64 now := time.Now() for _, e := range entries { if e.IsDir() || !strings.HasSuffix(e.Name(), ".log") { continue } info, err := e.Info() if err != nil { continue } lf := logFileInfo{ name: e.Name(), size: info.Size(), modTime: info.ModTime(), } logFiles = append(logFiles, lf) totalSize += lf.size } if len(logFiles) == 0 { continue } // 按修改时间升序排列(最旧的在前) sort.Slice(logFiles, func(i, j int) bool { return logFiles[i].modTime.Before(logFiles[j].modTime) }) var deleted int var freed int64 // Step 1: 删除超过7天的文件 cutoff := now.AddDate(0, 0, -logRetentionDays) remaining := make([]logFileInfo, 0, len(logFiles)) for _, f := range logFiles { if f.modTime.Before(cutoff) { if ok, sz := removeLogFile(dir, f); ok { deleted++ freed += sz totalSize -= sz } } else { remaining = append(remaining, f) } } // Step 2: 若剩余总大小超过100MB,从最旧的文件开始删除(索引遍历避免切片复制) idx := 0 for totalSize > logMaxTotalSize && idx < len(remaining) { if ok, sz := removeLogFile(dir, remaining[idx]); ok { deleted++ freed += sz totalSize -= sz } idx++ } if deleted > 0 { kept := len(remaining) - idx if kept < 0 { kept = 0 } util.GetTagLog().Infof("sys", "CleanLogs:清理完成,删除%d个文件,释放%.1fKB,剩余%d个文件,总大小%.1fKB", deleted, float64(freed)/1024, kept, float64(totalSize)/1024) } } }