2024-01-23 13:37:51 +08:00
|
|
|
package loggerx
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2024-05-28 09:30:57 +08:00
|
|
|
// 监听dir文件夹的所有文件,循环查找是否有超过days天的文件,删除掉
|
|
|
|
|
|
2024-01-23 13:37:51 +08:00
|
|
|
func (l *Logger) delete() {
|
2024-06-26 17:41:17 +08:00
|
|
|
tick := time.NewTicker(time.Hour)
|
2026-09-13 20:41:27 +08:00
|
|
|
defer tick.Stop()
|
2024-06-26 17:41:17 +08:00
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-tick.C:
|
2026-09-13 20:41:27 +08:00
|
|
|
// 后台清理不能把整个进程带崩
|
|
|
|
|
func() {
|
|
|
|
|
defer func() {
|
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
|
fmt.Println("清理日志文件异常:", r)
|
|
|
|
|
}
|
|
|
|
|
}()
|
2026-09-13 21:53:37 +08:00
|
|
|
// 先清掉「压缩完成但源文件没删掉」留下的冗余文件
|
|
|
|
|
if err := l.healCompressedLeftovers(); err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
}
|
2026-09-13 20:41:27 +08:00
|
|
|
if err := l.walkAndDel(); err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
2024-06-26 17:41:17 +08:00
|
|
|
case <-l.ctx.Done():
|
|
|
|
|
return
|
2026-09-13 20:41:27 +08:00
|
|
|
case <-l.done:
|
|
|
|
|
return
|
2024-06-26 17:41:17 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *Logger) walkAndDel() error {
|
2026-09-13 20:41:27 +08:00
|
|
|
// 没设置删除天数(<=0 表示不删除)
|
|
|
|
|
if l.option.days <= 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deadline := time.Now().AddDate(0, 0, -l.option.days)
|
|
|
|
|
|
2024-01-23 13:37:51 +08:00
|
|
|
err := filepath.Walk(l.option.dir, func(path string, info os.FileInfo, err error) error {
|
|
|
|
|
if err != nil {
|
2026-09-13 20:41:27 +08:00
|
|
|
// 单个文件出错不应该中断整个遍历
|
2024-01-23 13:37:51 +08:00
|
|
|
fmt.Println(err)
|
2024-06-26 19:00:16 +08:00
|
|
|
return nil
|
2024-01-23 13:37:51 +08:00
|
|
|
}
|
|
|
|
|
|
2026-09-13 20:41:27 +08:00
|
|
|
// 最后修改时间在保留期内,跳过
|
|
|
|
|
if info.ModTime().After(deadline) {
|
2024-01-23 13:37:51 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if info.IsDir() {
|
|
|
|
|
if !isEmptyDir(path) {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2026-09-13 21:53:37 +08:00
|
|
|
} else if ext := filepath.Ext(path); ext != ".log" && ext != ".gz" {
|
|
|
|
|
// 只清理日志与压缩归档
|
2026-09-13 20:41:27 +08:00
|
|
|
return nil
|
2024-01-23 13:37:51 +08:00
|
|
|
}
|
2026-09-13 20:41:27 +08:00
|
|
|
|
|
|
|
|
// 删除文件 / 空目录
|
|
|
|
|
if rerr := os.Remove(path); rerr != nil {
|
|
|
|
|
// 正被写入的文件在 Windows 上删不掉,等下一轮再试,不要终止遍历
|
|
|
|
|
fmt.Println("删除文件失败", path, rerr)
|
2024-01-23 13:37:51 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
fmt.Println("删除文件", path)
|
2026-09-13 20:41:27 +08:00
|
|
|
return nil
|
2024-01-23 13:37:51 +08:00
|
|
|
})
|
|
|
|
|
|
2024-06-26 17:41:17 +08:00
|
|
|
return err
|
2024-01-23 13:37:51 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-26 17:41:17 +08:00
|
|
|
// 判断空文件夹
|
2024-01-23 13:37:51 +08:00
|
|
|
func isEmptyDir(path string) bool {
|
|
|
|
|
files, err := os.ReadDir(path)
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return len(files) == 0 // 文件夹为空
|
|
|
|
|
}
|