清理/var/log日志需遵循不盲目删除、先定位再处理、保留服务可用性原则,优先用find -mtime、logrotate或journalctl分类治理,禁用rm清空活跃日志而应truncate。

清理 /var/log 下的旧日志,核心原则是:**不盲目删除、先定位再处理、保留服务可用性**。最常用且安全的方式不是写循环,而是用 find 配合 -mtime 精准筛选,或交给 logrotate 和 journalctl 分类治理。
快速定位哪些日志占空间最多
先别急着删,用下面命令找出“大户”:
-
du -sh /var/log/* | sort -hr | head -10—— 查看前 10 大目录/文件 -
journalctl --disk-usage—— 单独看 systemd-journald 占了多少(常达 GB 级) -
ls -lSh /var/log/*.log | head -5—— 列出最大的几个 .log 文件
按类型分类清理,避免误伤
systemd-journald 日志(/var/log/journal/)
它不走 logrotate,需单独处理:
- 临时清理:运行
sudo journalctl --vacuum-time=30d(保留最近 30 天)或--vacuum-size=500M - 永久限制:编辑
/etc/systemd/journald.conf,设置SystemMaxUse=500M和SystemMaxFileSize=100M,再执行sudo systemctl restart systemd-journald
传统 syslog 类文件(如 messages、secure、syslog)
这些通常由 logrotate 管理,优先走标准流程:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 检查是否生效:
sudo logrotate -d /etc/logrotate.conf(调试模式,不执行) - 强制轮转一次:
sudo logrotate -f /etc/logrotate.conf(会压缩、归档、删除旧文件) - 手动清理已归档的旧压缩包:
sudo find /var/log -name "*.log.*.gz" -mtime +30 -delete
其他应用日志(如 nginx、mysql、docker)
路径可能在 /var/log/nginx/、/var/log/mysql/ 或 /var/lib/docker/containers/:
- 确认归属服务是否启用,再决定清理方式
- 若无 logrotate 配置,可用 find 安全清理:
sudo find /var/log/nginx -name "*.log" -type f -mtime +30 -delete
安全清空正在写入的日志文件(慎用 rm)
像 /var/log/messages 这类被 rsyslogd 持有句柄的文件,不能用 rm——删了文件还在写,磁盘不释放,还可能引发异常。
- 推荐用
truncate -s 0 /var/log/messages(保留 inode,服务无感) - 等效写法:
sudo > /var/log/messages或sudo cat /dev/null > /var/log/messages - 批量清空多个:
sudo truncate -s 0 /var/log/{messages,secure,auth.log}
做成自动清理(可选)
加到 root 的 crontab 中,每天凌晨执行:
- 清理普通日志:
0 2 * * * find /var/log -name "*.log" -type f -mtime +30 -delete 2>/dev/null - 清理 journald:
0 3 * * * journalctl --vacuum-time=30d 2>/dev/null
注意:所有 -delete 操作前,建议先用 -ls 或 -print 预览匹配结果,确认路径和时间无误再执行。

















