| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 | 
							- package log
 
- import (
 
- 	"context"
 
- 	"io/fs"
 
- 	"log"
 
- 	"os"
 
- 	"path/filepath"
 
- 	"regexp"
 
- 	"slices"
 
- 	"strings"
 
- 	"time"
 
- )
 
- type AutoClear struct {
 
- 	LogPath   string        // 日志存放路径
 
- 	CycleTime time.Duration // 循环等待时间
 
- 	SaveDays  int           // 保留的天数
 
- 	Suffix    []string      // 需要清理的后缀, 例如 .log
 
- }
 
- func (ac *AutoClear) initConfig() {
 
- 	if ac.CycleTime <= 0 {
 
- 		ac.CycleTime = 12 * time.Hour
 
- 	}
 
- 	if ac.SaveDays <= 0 {
 
- 		ac.SaveDays = 7
 
- 	}
 
- 	if len(ac.Suffix) == 0 {
 
- 		ac.Suffix = []string{".log", ".out"} // 日志与 PProf
 
- 	}
 
- 	if ac.LogPath == "" {
 
- 		log.Panic("LogPath is required")
 
- 	}
 
- 	ac.LogPath = filepath.Join(ac.LogPath)
 
- }
 
- func (ac *AutoClear) convertDateStrToTime(dateStr string) (time.Time, error) {
 
- 	return time.Parse("20060102", dateStr)
 
- }
 
- func (ac *AutoClear) runAs(dateRegex *regexp.Regexp) {
 
- 	currentDate := time.Now()
 
- 	currentDateStr := currentDate.Format("20060102")
 
- 	err := filepath.WalkDir(ac.LogPath, func(path string, d fs.DirEntry, err error) error {
 
- 		if err != nil {
 
- 			return err
 
- 		}
 
- 		hasSuffix := slices.ContainsFunc(ac.Suffix, func(suffix string) bool {
 
- 			return strings.HasSuffix(d.Name(), suffix)
 
- 		})
 
- 		if !d.IsDir() && hasSuffix {
 
- 			matches := dateRegex.FindStringSubmatch(path)
 
- 			if len(matches) > 0 {
 
- 				// 转换 YYYY_MM_DD 为 YYYYMMDD 格式
 
- 				fileDateStr := matches[1] + matches[2] + matches[3]
 
- 				fileDate, err := ac.convertDateStrToTime(fileDateStr)
 
- 				if err != nil {
 
- 					log.Printf("log.AutoClear: Failed to parse date from %s: %v\n", path, err)
 
- 					return nil
 
- 				}
 
- 				deltaDays := int(currentDate.Sub(fileDate).Hours() / 24)
 
- 				// 删除 SaveDays 之前的文件
 
- 				if deltaDays > ac.SaveDays {
 
- 					if err = os.Remove(path); err != nil {
 
- 						log.Printf("log.AutoClear: Failed to delete %s: %v\n", path, err)
 
- 						return nil
 
- 					}
 
- 					log.Printf("log.AutoClear: deleted old log file: %s\n", path)
 
- 				}
 
- 			}
 
- 		}
 
- 		return nil
 
- 	})
 
- 	if err != nil {
 
- 		log.Printf("log.AutoClear: Error walking directory: %v", err)
 
- 		return
 
- 	}
 
- 	log.Printf("log.AutoClear: %s old log files deletion process completed.\n", currentDateStr)
 
- }
 
- func (ac *AutoClear) Start(ctx context.Context) {
 
- 	ac.initConfig()
 
- 	// 匹配 YYYY_MM_DD 格式的日期
 
- 	dateRegex, err := regexp.Compile(`(\d{4})_(\d{2})_(\d{2})`)
 
- 	if err != nil {
 
- 		log.Panicf("log.AutoClear: Failed to compile regex: %v\n", err)
 
- 	}
 
- 	timer := time.NewTimer(ac.CycleTime)
 
- 	defer timer.Stop()
 
- 	for {
 
- 		select {
 
- 		case <-ctx.Done():
 
- 			return
 
- 		case <-timer.C:
 
- 			ac.runAs(dateRegex)
 
- 			timer.Reset(ac.CycleTime)
 
- 		}
 
- 	}
 
- }
 
 
  |