Linux日志清理核心是“看得清、控得住、留得稳”:用du查目录大小,find定位大日志文件,优先truncate清空、归档压缩或按规删除,并通过logrotate、journald配置和Docker日志限制实现长效治理。

Linux系统中目录大小统计和日志清理,关键在于不误删、不中断服务、不填满磁盘。重点不是“删得快”,而是“看得清、控得住、留得稳”。
快速查看各目录占用空间(含子目录)
用 du 配合合理参数,避免卡顿或权限报错:
-
sudo du -sh /* 2>/dev/null | sort -hr—— 查看根下一级目录总大小,忽略权限错误,按大小倒序 -
sudo du -sh /var/* 2>/dev/null | sort -hr | head -10—— 重点查/var(日志、缓存常驻地),只看前10个最大项 -
sudo du -sh /var/log/* 2>/dev/null | sort -hr—— 定位具体日志目录,如journal、apache2、docker等
注意:du -sh 中的 -h 输出人类可读单位(M/G),-s 表示汇总不展开子项;2>/dev/null 过滤无权限提示,不影响结果准确性。
识别真正的大日志文件(非目录)
日志膨胀通常由单个未轮转的文件引起(如 messages.log.1、app.err 或无后缀的运行日志)。用以下命令精准定位:
-
sudo find /var/log -type f -size +100M -ls 2>/dev/null | sort -k7,7nr | head -10—— 找出大于100MB的普通文件,按大小倒序列出详细信息 -
sudo ls -lSh /var/log/*.log* 2>/dev/null | head -5—— 列出日志类文件,按文件大小排序(-S),直观看到最大的几个
常见隐患文件:未配置 logrotate 的自定义应用日志、journald 未限制时生成的 /var/log/journal/xxx/system.journal、Docker容器的 json.log(路径如 /var/lib/docker/containers/*/logs/*.log)。
安全清理日志的三种方法(按风险从低到高)
清理前务必确认该日志是否被进程持续写入(用 lsof -n | grep deleted 可辅助判断已删除但句柄仍打开的文件)。
-
清空内容但保留文件(推荐首选):
sudo truncate -s 0 /var/log/bigfile.log或sudo > /var/log/bigfile.log。不改变 inode、权限、软链接,进程可继续写入,服务零中断 -
归档后清空(需保留短期可查记录):
sudo gzip /var/log/bigfile.log && sudo truncate -s 0 /var/log/bigfile.log。压缩后体积骤减,原名变bigfile.log.gz -
删除文件(仅限确认无进程占用且已轮转完毕):
sudo rm /var/log/bigfile.log.4(老归档)或sudo journalctl --vacuum-size=500M(journald 自清理)。切勿直接删正在写的主日志(如messages或syslog)
预防日志再次暴增(治本之策)
临时清理只是救火,长期要靠机制约束:
-
检查并启用 logrotate:确认
/etc/logrotate.d/下有对应配置,且/etc/logrotate.conf中未注释include /etc/logrotate.d;手动测试:sudo logrotate -d /etc/logrotate.conf(-d 表示调试模式,不真实执行) -
限制 journald 日志大小:编辑
/etc/systemd/journald.conf,取消注释并修改:SystemMaxUse=500M、MaxRetentionSec=2week,然后执行sudo systemctl restart systemd-journald -
容器日志限速限大小:在
/etc/docker/daemon.json中添加:{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}},重启 Docker 生效
不复杂但容易忽略:清理后用 df -h 验证磁盘释放,再用 tail -n 5 /var/log/syslog 确认系统日志仍在正常写入。










