安全清空日志须分三步:先用journalctl --vacuum-size或配置journald.conf管控systemd日志;再用logrotate轮转传统日志并修复权限;最后手动truncate清理docker、apt等漏网日志,避免rm删除导致句柄异常。

直接删 /var/log 下的文件大概率会出事——服务可能卡住、日志写不进新内容、甚至 systemd-journald 报错退出。真正安全有效的做法是分三块处理:先压住 journalctl 这个最大头,再让 logrotate 管住传统日志,最后清理那些没人管的“漏网之鱼”。
journalctl 日志占满 /var/log/journal 怎么清
journalctl 是当前 Linux 系统日志膨胀的头号来源,尤其在桌面或长期运行的服务器上,/var/log/journal/ 下二进制日志能轻松涨到几 GB。手动删 .journal 文件会破坏索引,导致后续 journalctl 命令报 Invalid argument 或服务拒绝写日志。
- 临时释放空间:用
sudo journalctl --vacuum-size=500M(保留最新 500MB)或sudo journalctl --vacuum-time=7d(只留最近 7 天) - 永久生效:编辑
/etc/systemd/journald.conf,取消注释并设值:SystemMaxUse=500M、SystemMaxFileSize=100M、MaxRetentionSec=2week,然后sudo systemctl restart systemd-journald - 验证是否加载:运行
sudo systemd-analyze cat-config systemd/journald.conf | grep -E "(MaxUse|Retention)",确认输出里有你设的值
logrotate 不工作导致 syslog、auth.log 等越滚越大
很多系统默认启用了 logrotate,但规则常因权限错误或路径写错而静默失效。比如 /var/log 目录权限不是 755 或属主不是 root,logrotate 就会跳过所有日志,不报错也不轮转。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 检查是否真在跑:执行
sudo logrotate -d /etc/logrotate.conf,看输出里有没有error: skipping "/var/log/syslog" because parent directory has insecure permissions - 修复权限:
sudo chmod 755 /var/log && sudo chown root:root /var/log - 确认规则存在:检查
/etc/logrotate.d/rsyslog是否包含类似/var/log/syslog { daily rotate 7 compress missingok }的配置 - 手动触发一次:
sudo logrotate /etc/logrotate.conf,然后看/var/log/syslog.1是否生成、原文件是否变空
哪些日志 logrotate 默认不管,得自己动手
第三方服务(如 Docker、MySQL、Nginx)和系统组件(如 APT、unattended-upgrades)的日志通常不在 logrotate 默认管辖范围内,容易变成“磁盘黑洞”。
- Docker 容器日志:
/var/lib/docker/containers/*/*-json.log,需单独配/etc/logrotate.d/docker,关键加copytruncate避免重启容器 - APT 升级日志:
/var/log/apt/history.log和/var/log/apt/term.log可直接sudo truncate -s 0 /var/log/apt/*.log - unattended-upgrades:
sudo find /var/log/unattended-upgrades -name "*.log" -mtime +30 -delete - nohup.out:
nohup启动的进程不会被logrotate捕获,建议改用带日期的重定向:nohup your-command > nohup_$(date +\%Y\%m\%d).log 2>&1 &
清理后空间没释放?别急着再删
执行 rm 或 truncate 后 df -h 显示空间没回来,大概率是有进程还在往已被删除或清空的文件句柄里写——这就是“幽灵占用”。lsof +L1 能列出这类已删除但仍被打开的文件。
- 查谁在占:
sudo lsof +L1 | grep "/var/log" - 常见 culprit:rsyslog、nginx、java 应用进程;对应解决就是
sudo systemctl restart rsyslog或重启具体服务 - 别用
cat /dev/null > xxx.log清空,它可能触发某些应用的写入异常;优先用truncate -s 0 xxx.log
最易被忽略的一点:journalctl 和 logrotate 是两套独立机制,改了其中一个,另一个照样能把你硬盘吃光。必须同时配好两者,并定期用 journalctl --disk-usage 和 du -sh /var/log/*.log* 交叉验证。










