| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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)
- }
- }
- }
|