日志清理核心在于源头治理而非单纯删除:先用df -i和du --inodes定位inode耗尽元凶,优先启用logrotate实现压缩轮转防小文件爆炸,对失控目录分批清理,并通过journald、Docker及应用层配置限制日志生成量。

日志清理脚本不是“定期删文件”那么简单,核心是控制日志的生成方式、留存周期和存储结构,从源头避免小文件爆炸式增长。关键不在删得多快,而在让日志本身就不容易把 inode 耗光。
先确认日志是不是真凶
别一上来就写脚本。先跑两行命令看日志是否主导 inode 消耗:
- df -i —— 看哪个挂载点 IUse% 接近或达到 100%
- du --inodes -s /var/log/* 2>/dev/null | sort -nr | head -10 —— 快速定位 /var/log 下哪些子目录占 inode 最多(比如 journal、apache2、nginx、docker)
用 logrotate 做主力,不是自己手写 find + rm
logrotate 是系统级日志治理工具,它能合并、压缩、轮转、删除,且行为可审计、不卡 shell、不触发 OOM。一个典型配置示例如下(存为 /etc/logrotate.d/myapp):
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
sharedscripts
postrotate
systemctl kill --signal=SIGHUP myapp.service > /dev/null 2>&1 || true
endscript
}重点参数说明:
- compress:压缩旧日志 → 减少文件数(一个 .log.gz 替代多个 .log.1、.log.2…)
- rotate 7:只保留 7 份 → 明确上限,防无限堆积
- delaycompress:最新一轮不压,方便排查;压缩滞后一步,更安全
- sharedscripts + postrotate:统一 reload 服务,避免日志句柄残留
对已失控的日志目录,用脚本安全清空
如果 /var/log/journal 或 /var/log/containers 已有百万级小文件,直接 rm -rf 会卡死。推荐分批 + 原子化处理:
- 按天清理旧日志:find /var/log/myapp -name "*.log" -mtime +30 -print0 | xargs -0 -n 500 rm -f
- 清空整个目录但不删目录本身(更稳):mkdir /tmp/empty && rsync -a --delete /tmp/empty/ /var/log/myapp/ && rmdir /tmp/empty
- 查是否有进程还占着已删日志:lsof +L1 | grep "/var/log",若有则重启对应服务
预防比清理更重要:三类配置要检查
脚本再好,也架不住源头持续产垃圾。以下三项必须落实:
- systemd-journald:编辑 /etc/systemd/journald.conf,设 SystemMaxUse=500M、MaxFileSec=2week,然后 systemctl restart systemd-journald
- Docker 日志驱动:在 /etc/docker/daemon.json 中配置:{"log-driver":"local","log-opts":{"max-size":"10m","max-file":"3"}},避免每个容器 stdout 生成无限小文件
- 应用层日志框架:如 Log4j、Zap、Winston,禁用按请求/按秒生成日志文件的模式,强制使用 RollingFileAppender 或异步批量写入

















