如何调整 systemd 日志轮转策略防止磁盘空间占满

文章导读
调整 systemd 日志轮转策略最直接的方法是修改/etc/systemd/journald.conf 配置文件限制日志大小,并使用 journalctl 命令立即清理现有日志。该方案适用于所有基于 systemd 的 Linux 发行版,风险在于设置过小的限额可能导致故障排查时缺少关键历史日志。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

调整 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 且磁盘紧张),执行下一步清理。

如何调整 systemd 日志轮转策略防止磁盘空间占满

2. 立即清理历史日志

使用 vacuum 参数清理旧日志,此操作立即生效,无需重启服务。可根据时间或大小清理。

# 按大小清理,保留最近 500M
sudo journalctl `--vacuum-size`=500M

# 按时间清理,保留最近 3 天
sudo journalctl `--vacuum-time`=3d

3. 修改持久化配置

编辑/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. 再次检查磁盘占用

如何调整 systemd 日志轮转策略防止磁盘空间占满

执行journalctl `--disk-usage`,确认占用空间已降至设定的 SystemMaxUse 以下。

2. 观察日志写入

使用journalctl -f实时查看日志,确认新日志能正常流入,没有报错。

3. 检查服务状态

执行systemctl status systemd-journald,确认服务处于 active (running) 状态,无失败记录。

常见坑

1. 配置文件未取消注释

journald.conf 中默认参数常被#注释掉,修改时必须去掉行首的#,否则配置不生效。

2. 忽略/log/journal 目录权限

如何调整 systemd 日志轮转策略防止磁盘空间占满

如果手动创建过/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