判断文件是否超期应使用os.path.getmtime()获取系统记录的最后修改时间而非解析文件名,结合time.time()计算阈值比较;推荐用pathlib.path.rglob()递归扫描并按后缀过滤日志文件;删除前必须dry-run、异常捕获且优先检查磁盘空间。

用 os.path.getmtime() 判断文件是否超期
关键不是看文件名里有没有日期,而是读取系统记录的最后修改时间。日志文件通常写完就不再改动,os.path.getmtime() 返回的时间戳基本等价于生成时间。注意:Windows 下该函数返回的是“最后写入时间”,Linux/macOS 下是“mtime”,行为一致,可直接用。
实操建议:
- 用
time.time()获取当前时间戳,减去 30 天秒数(30 * 24 * 3600)得到阈值 - 对每个候选文件调用
os.path.getmtime(filepath),与阈值比较 - 别用
datetime做字符串解析——万一日志没按标准格式命名(比如app_log_2023-01-01.txt缺位或带空格),就直接失效
遍历目录时避开子目录和非日志文件
直接 os.listdir() 或 glob.glob("*.log") 容易误删:前者会混入 .py、.tmp 等,后者不递归、也匹配不到 .txt 日志。更稳妥的是用 pathlib.Path + 后缀过滤 + 深度控制。
实操建议:
- 用
Path("logs").rglob("*")递归扫描,再用.suffix in {".log", ".txt", ".out"}过滤 - 加一层
if p.is_file()排除目录和符号链接,避免getmtime报错 - 如果日志分散在多级子目录(如
logs/2024/04/app.log),必须用rglob;若只在平级目录,用glob("*.log")更快
删除前务必加 dry-run 开关和异常捕获
删错日志可能影响排障,线上脚本必须默认不真删。常见错误包括:文件正被其他进程写入(导致 PermissionError 或 BlockingIOError)、路径含中文或特殊字符(Windows 下容易出编码问题)、权限不足(尤其 Linux 上非 owner 运行)。
实操建议:
- 命令行加
--dry-run参数,用print(f"[DRY] would remove {p}")预览,确认无误再去掉开关 - 实际删除用
try / except (OSError, PermissionError) as e:包裹,打印错误但不停止整个流程 - 避免用
os.remove(),改用p.unlink(missing_ok=True)(Python 3.8+),自动忽略不存在文件,减少判断
定时运行别只靠 crontab 或 Windows 任务计划
单纯配个 0 2 * * * python clean_logs.py 很危险:脚本出错不会通知你,磁盘满也没预警。更现实的做法是把清理逻辑封装成可复用函数,并集成基础监控。
实操建议:
- 函数返回一个字典,如
{"deleted": 12, "failed": 1, "total_size_freed_mb": 42.3},方便后续打日志或上报 - 在脚本末尾加
if __name__ == "__main__":分支,支持命令行直接运行,也支持被其他模块导入调用 - 真正部署时,建议用
logging记录每次执行详情(包括删了哪些文件),而不是只 print 到终端——否则 crontab 的输出容易丢失
最常被忽略的是:没检查磁盘剩余空间就硬删。有些业务日志量极大,30 天可能只占总量 5%,删了也没用;反过来,如果磁盘只剩 2%,就得优先删最老的 100 个,而不是固定天数。这个逻辑得自己加,Python 标准库不替你做决策。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











