用过 Linux 的人都知道,日志文件不知不觉就占满了磁盘。尤其是 systemd 管理的日志,随着时间推移,/var/log/journal 目录下的文件可能膨胀到几个 GB 甚至更多。这时候,systemd 日志轮转管理就成了必须掌握的技能。
什么是日志轮转
日志轮转其实就是定期把当前日志归档、压缩或删除旧内容的过程。systemd-journald 默认会持续记录所有服务、内核和用户会话的日志,如果不加控制,时间一长就会拖慢系统,甚至导致服务无法写入新日志。
查看当前日志占用情况
想知道你的系统日志有多大,直接运行:
journalctl --disk-usage
输出可能类似:
Archived and active journals take up 1.2G in the file system.
这个 1.2G 就是当前所有日志的总大小。如果数字让你皱眉,那就该动手设置了。
配置日志保留策略
systemd 的日志行为由 /etc/systemd/journald.conf 控制。打开这个文件:
sudo vim /etc/systemd/journald.conf
找到或添加以下几行:
SystemMaxUse=500M
SystemKeepFree=100M
SystemMaxFileSize=50M
MaxRetentionSec=1month
解释一下这几个参数:
- SystemMaxUse:日志最多占用多少磁盘空间,超过后自动清理旧日志。
- SystemKeepFree:确保日志目录所在分区至少留出这么多空间。
- SystemMaxFileSize:单个日志文件最大体积,防止单个文件过大。
- MaxRetentionSec:日志最长保留时间,比如设成 1month 就是一个月前的日志会被清除。
改完保存,然后重启日志服务生效:
sudo systemctl restart systemd-journald
手动清理已有日志
配置只管未来,已经存在的大日志还得手动处理。可以用 journalctl 按时间删:
sudo journalctl --vacuum-time=2weeks
这会保留最近两周的日志,更早的统统清理。也可以按大小清理:
sudo journalctl --vacuum-size=300M
执行后,系统会自动挑选最老的日志删掉,直到总大小低于 300M。
实际场景:家里那台跑着 Docker 的服务器
我有台老旧笔记本放在客厅当家庭服务器,跑着几个 Docker 容器。某天发现 SSH 登不进去,U 盘插上去也识别不了。进 BIOS 看硬盘可用空间为 0。查了一圈才发现是 /var/log/journal 塞了 8G 日志。从那以后,每台新装的机器第一件事就是配好 journald.conf。
别忘了定时任务
虽然 systemd 自带轮转,但为了保险,可以加个 cron 每周检查一次:
sudo crontab -e
加上一行:
0 2 * * 0 /usr/bin/journalctl --vacuum-time=4weeks >/dev/null 2>&1
每周日凌晨两点自动清理超过一个月的日志,省心得多。