清理生产环境历史日志的关键是删得准、稳、可追溯:限定目录(如/data/app/logs/)、精确匹配后缀、加-type f和-maxdepth 2,先预览再删除并记录,推荐压缩或归档替代直接删除。

直接用 find -mtime +30 清理生产环境的历史日志,关键不是“能不能删”,而是“删得准、删得稳、删得可追溯”。非核心日志(比如应用临时日志、调试日志、归档备份日志)可以清理,但必须避开正在被进程写入的活跃文件、系统关键路径(如 /var/log/journal)、以及硬链接或挂载点下的伪文件。
明确目标范围,避免误伤
先限定目录和文件类型,不盲目扫全盘:
- 只清理指定业务日志目录,例如:
/data/app/logs/、/opt/myapp/archive/,不碰/var/log/下的 systemd 或 rsyslog 主日志 - 用
-name "*.log"或-name "access_*.txt"精确匹配后缀,避免误删.pid、.lock或配置文件 - 加
-type f确保只处理普通文件,跳过目录、socket、设备节点 - 加
-maxdepth 2控制搜索深度,防止递归进意外子卷或 NFS 挂载点
安全执行:先查再删,留痕可验
绝不直接执行删除命令。分两步走:
- 先预览将被清理的文件:
find /data/app/logs/ -type f -name "*.log" -mtime +30 -ls - 确认无误后,再执行删除,并记录操作时间与文件数:
find /data/app/logs/ -type f -name "*.log" -mtime +30 -print0 | xargs -0 rm -f && echo "$(date): $(find /data/app/logs/ -type f -name '*.log' -mtime +30 | wc -l) files removed" >> /var/log/clean-logs.log
集成到定时任务,带权限与环境隔离
写成独立脚本并设为 root 执行,避免 crontab 环境变量缺失导致路径错误:
- 创建脚本:
/usr/local/bin/clean-old-logs.sh - 内容示例:
#!/bin/bash<br>LOG_DIR="/data/app/logs"<br>find "$LOG_DIR" -type f -name "*.log" -mtime +30 -print0 | xargs -0 rm -f<br>echo "$(date): cleanup done for $LOG_DIR" >> /var/log/clean-logs.log
- 赋权:
chmod 755 /usr/local/bin/clean-old-logs.sh - cron 设置(每天凌晨 2:15 执行):
15 2 * * * /usr/local/bin/clean-old-logs.sh
补充建议:比删除更稳妥的替代方案
对部分仍需保留痕迹但又占空间的日志,可考虑压缩归档而非直接删除:
- 把 30 天前的
.log改为.log.gz:find /data/app/logs/ -type f -name "*.log" -mtime +30 -exec gzip {} \; - 或统一移到归档目录,便于审计调阅:
mkdir -p /data/app/logs/archive/$(date -d '30 days ago' +%Y%m); find /data/app/logs/ -type f -name "*.log" -mtime +30 -exec mv {} /data/app/logs/archive/$(date -d '30 days ago' +%Y%m)/ \;











