用 du -xh --max-depth=1 /var/log | sort -hr | head -20 快速定位大日志文件;注意 /var/log/journal/ 需用 journalctl --disk-usage 单独查;禁用 rm -f *.log,优先用 truncate 或 logrotate -f 安全清理。

怎么快速查出 /var/log 下哪些文件占了最多空间
直接看总大小没用,得定位大日志文件。别用 du -sh /var/log/* 逐个试,它会卡在压缩包或权限不足的目录里。du 加 -x(不跨文件系统)和 --max-depth=1 更稳,再配合 sort -hr 排序:
du -xh --max-depth=1 /var/log | sort -hr | head -20
常见干扰项:journal 目录(systemd-journald 日志)可能不显示在 /var/log 下,但实际占空间;.gz 文件是归档日志,du 能算准,但别误删——它们是 logrotate 压缩后留下的,删了也没释放磁盘。
-
/var/log/journal/占用常被忽略,用journalctl --disk-usage单独查 - 某些服务(如
nginx、mysql)可能把日志写到/var/log外,比如/var/lib/mysql/error.log -
du结果单位是“人眼友好”的K/M/G,但排序依赖sort -h,老系统没-h就用du -xB M --max-depth=1 /var/log | sort -nr
logrotate 没生效?先检查配置和触发时机
logrotate 不是实时运行的,靠 cron 触发(通常是每天一次),配置错或没 reload 就一直涨。别急着手动删,先确认它是否真在干活:
ls -lt /var/log/*.log* | head -5
看时间戳:如果最近一周都没新压缩文件(.log.1.gz 这类),大概率没转成功。关键检查点:
- 主配置
/etc/logrotate.conf是否包含include /etc/logrotate.d/ - 服务专属配置(如
/etc/logrotate.d/nginx)里有没有size或daily冲突(比如写了size 100M又写了daily,优先级以第一个匹配条件为准) - 执行
logrotate -d /etc/logrotate.conf(dry-run 模式)看输出里有没有报错,比如error: skipping "/var/log/nginx/access.log" because parent directory has insecure permissions
systemd-journald 日志爆满的典型表现和清理方式
现象很直接:journalctl -n 10 慢、df -h 显示 /var 满了但 du 算不出来源。这是因为 journald 默认把日志存在二进制文件里,du 不容易穿透,而 journalctl --disk-usage 才是真实值。
临时清理用 journalctl --vacuum-size=500M(保留最新 500MB),比 --vacuum-time=2d 更可控——时间策略在高负载机器上可能留一堆小文件,反而更占 inode。
- 永久限制要改
/etc/systemd/journald.conf,重点调SystemMaxUse=和SystemMaxFileSize=,改完必须systemctl kill --signal=SIGHUP systemd-journald重载 - 禁用持久化?设
Storage=volatile,但重启后所有日志丢失,只适合容器或测试机 -
journalctl --disk-usage输出里如果显示Archived and active journals take up,说明旧日志已归档但没被 vacuum 清掉
手动能删日志吗?什么能删、什么碰都别碰
能删,但得看清楚类型。直接 rm -f /var/log/*.log 是最危险操作——有些服务(如 rsyslog)会持续写入同一个文件句柄,删了只是删掉文件名,磁盘空间不会释放,进程还在往“已删除文件”里写。
安全做法分三类:
- 确认已关闭的服务日志(如停掉
docker后的/var/log/docker.log),先truncate -s 0 /var/log/docker.log清空内容,再删 - logrotate 管理的文件(带数字后缀的
.log.1、.log.2.gz),可直接rm,但建议用logrotate -f /etc/logrotate.d/xxx强制转一次再删旧的 - 绝对不碰:
/var/log/journal/*/system.journal(删了 journalctl 报错)、/var/log/wtmp(影响last命令)、/var/log/btmp(影响lastb)
最易被忽略的是:lsof +L1 能列出所有“已删除但仍有进程打开的文件”,这类才是真正卡住空间的元凶,得杀进程或重启服务才能彻底释放。










