调整 systemd 日志轮转策略最直接的方法是修改/etc/systemd/journald.conf 配置文件限制日志大小,并使用 journalctl 命令立即清理现有日志。该方案适用于所有基于 systemd 的 Linux 发行版,风险在于设置过小的限额可能导致故障排查时缺少关键历史日志。
先说结论:通过配置 journald.conf 限制最大占用空间,配合 vacuum 命令清理旧日志,可有效防止磁盘被日志占满。
- 适合:使用 systemd 管理日志的 Linux 服务器,尤其是/var/log/journal 目录增长过快的场景
- 先准备:确认当前日志占用空间,备份原有配置文件,规划合理的日志保留大小
- 验收:修改配置后重启服务,确认磁盘使用率不再异常增长,且新日志能正常写入
命令速用版
以下命令可直接在终端执行,用于查看占用、立即清理和修改配置。
# 查看当前日志占用空间
journalctl `--disk-usage`
# 立即清理日志,保留最近 100M 空间
journalctl `--vacuum-size`=100M
# 立即清理日志,保留最近 7 天
journalctl `--vacuum-time`=7d
# 编辑配置文件
sudo vim /etc/systemd/journald.conf为什么会这样
systemd-journald 服务默认会收集内核、系统和服务日志,存储在/var/log/journal 目录中,若不限制大小会持续占用磁盘。
journald 服务设计为二进制日志存储,相比传统文本日志更高效,但默认配置在某些发行版中允许占用较大磁盘空间(例如文件系统的 10% 或特定阈值)。当服务器运行时间长或日志级别较高时,日志文件会不断累积。如果不配置轮转策略或上限,日志目录会一直增长直到磁盘空间耗尽,导致服务无法写入新数据甚至系统宕机。
分步处理
按以下步骤调整策略,先清理现有空间,再固化配置防止复发。
1. 检查当前日志占用
执行命令查看 journald 日志当前占用的磁盘空间,确认是否需要立即清理。
journalctl `--disk-usage`如果显示占用较大(例如超过 1GB 且磁盘紧张),执行下一步清理。
2. 立即清理历史日志
使用 vacuum 参数清理旧日志,此操作立即生效,无需重启服务。可根据时间或大小清理。
# 按大小清理,保留最近 500M
sudo journalctl `--vacuum-size`=500M
# 按时间清理,保留最近 3 天
sudo journalctl `--vacuum-time`=3d3. 修改持久化配置
编辑/etc/systemd/journald.conf 文件,取消注释并修改以下参数。这些参数控制日志保留的上限。
[Journal]
# 限制日志最大占用空间,例如 500M
SystemMaxUse=500M
# 限制单个日志文件最大大小,例如 50M
SystemMaxFileSize=50M
# 确保磁盘至少保留的空闲空间,例如 1G
SystemKeepFree=1G注意:参数值支持 K、M、G 单位。SystemMaxUse 优先于 SystemKeepFree 生效。
4. 重启 journald 服务
配置修改后需要重启服务才能生效。
sudo systemctl restart systemd-journald怎么验证是否生效
执行以下操作确认配置已应用且日志轮转正常。
1. 再次检查磁盘占用
执行journalctl `--disk-usage`,确认占用空间已降至设定的 SystemMaxUse 以下。
2. 观察日志写入
使用journalctl -f实时查看日志,确认新日志能正常流入,没有报错。
3. 检查服务状态
执行systemctl status systemd-journald,确认服务处于 active (running) 状态,无失败记录。
常见坑
1. 配置文件未取消注释
journald.conf 中默认参数常被#注释掉,修改时必须去掉行首的#,否则配置不生效。
2. 忽略/log/journal 目录权限
如果手动创建过/var/log/journal 目录,需确保所属组和权限正确(通常为 root:systemd-journal,权限 2755),否则 journald 可能无法写入。
3. 与 logrotate 冲突
systemd 日志是二进制格式,由 journald 自身管理轮转,不要尝试用 logrotate 强行轮转/var/log/journal 下的文件,可能导致日志损坏。
4. 设置过小导致丢失信息
如果 SystemMaxUse 设置得太小(如 10M),可能刚发生故障日志就被覆盖,建议根据磁盘大小预留至少几百兆空间。
常见问题
修改配置后必须重启服务器吗?
不需要重启服务器,只需重启 systemd-journald 服务即可生效。
清理日志会影响正在运行的服务吗?
不会,journalctl `--vacuum` 只删除旧日志文件,不影响服务当前运行状态和新日志写入。
为什么修改了配置空间没变小?
配置只限制未来增长,不会自动清理已有日志,必须手动执行一次 journalctl `--vacuum` 命令。
参考来源
- freedesktop.org, journald.conf — Journal service configuration files, https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html
- systemd 项目文档, Journal Service, https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html