配置 Systemd 日志限制:优化磁盘使用与日志轮转

通过 `journald.conf`、`journalctl` 和安全日志清理命令配置 systemd 日志大小和保留期限。

配置 Systemd 日志限制:优化磁盘使用与日志轮转

系统日志很有用,直到它们悄悄填满磁盘。在使用 systemd 的 Linux 系统上,systemd-journald 存储索引日志,并可以强制执行大小和期限限制,使日志保留足够的历史记录,同时不占用系统其他部分的空间。

本指南介绍在哪里配置 systemd 日志限制,持久存储和易失存储的区别,以及如何使用 journalctl 验证清理。

了解日志存储模式

在设置限制之前,了解日志存储位置至关重要。systemd-journald 支持两种主要存储模式,由 journald.conf 中的 Storage= 指令定义。

1. 易失存储(/run/log/journal

易失存储将日志保存在临时文件系统中,通常是 tmpfs 或内存支持的目录。存储在此处的日志在系统重启后丢失

  • 使用场景: 高度临时日志、资源受限环境(不需要持久历史记录)。
  • 配置: 设置 Storage=volatile

2. 持久存储(/var/log/journal

持久存储确保日志在系统重启后保留,使其成为服务器和生产系统的标准选择。如果目录 /var/log/journal 不存在,则会自动创建。

  • 使用场景: 需要审计跟踪和历史分析的生产系统。
  • 配置: 设置 Storage=persistentStorage=auto(默认值,如果 /var/log/journal 存在则激活持久存储)。

提示: 如果系统配置为 Storage=auto/var/log/journal 不存在,日志将默认使用易失存储,直到创建持久目录。

主要配置文件

systemd-journald 的所有主要限制和行为通过主配置文件控制,通常位于 /etc/systemd/journald.conf

# 编辑主配置文件
sudo nano /etc/systemd/journald.conf

为确保未来的软件包更新不会覆盖您的自定义设置,最佳实践是在目录 /etc/systemd/journald.conf.d/ 中创建覆盖文件。例如,创建 /etc/systemd/journald.conf.d/01-custom-limits.conf

实施大小限制以优化磁盘

控制日志增长的最常见方法是设置最大磁盘使用限制。当超过指定大小时,journald 会自动开始删除最旧的归档日志,直到达到限制。

SystemMaxUse(绝对持久限制)

此指令定义持久日志文件(/var/log/journal)可能占用的最大总磁盘空间。这是控制持久磁盘使用的主要机制。

如果总大小超过此值,日志文件将被轮转和清理。常用单位包括 K(千字节)、M(兆字节)、G(千兆字节)和 T(太字节)。

指令 描述 示例值
SystemMaxUse 持久日志数据的最大大小。 500M2G

示例配置:

将持久日志存储限制为最大 1 千兆字节:

[Journal]
SystemMaxUse=1G

SystemKeepFree(磁盘安全缓冲区)

虽然 SystemMaxUse 设置了上限,但 SystemKeepFree 作为关键的安全措施。它指定包含日志文件的文件系统上应保持的最小可用磁盘空间。

如果可用空间低于 SystemKeepFree 值,journald 将清理日志,即使尚未达到 SystemMaxUse 限制。这可以防止日志增长完全填满磁盘并停止关键系统操作。

指令 描述 示例值
SystemKeepFree 日志文件系统所需的最小可用空间。 10%4G

最佳实践: 强烈建议同时设置 SystemMaxUseSystemKeepFree。对于大驱动器,使用百分比 (%) 作为 SystemKeepFree 以获得更好的可扩展性。

RuntimeMaxUse(易失存储限制)

如果您使用易失存储(/run/log/journal),或者即使启用了持久存储也想控制内存/tmpfs 使用,请使用 RuntimeMaxUse。这控制易失日志文件使用的磁盘空间,这些文件是临时的,驻留在内存或 tmpfs 中。

指令 描述 示例值
RuntimeMaxUse 易失日志数据的最大大小。 300M

实施时间限制以保留日志

基于大小的限制确保磁盘空间得到维护,但不能保证日志的年龄。如果日志量低,日志可能无限期保留。基于时间的限制确保日志在特定持续时间后被轮转,无论总大小如何。

MaxRetentionSec

此指令指定日志应保留的最长时间。任何早于此持续时间的日志将被自动清除,补充大小限制。

指令 描述 示例值
MaxRetentionSec 保留日志的最大年龄。 30 days1 month2 weeks

示例配置:

确保日志不超过 30 天,且总持久存储不超过 5 千兆字节:

[Journal]
Storage=persistent
SystemMaxUse=5G
SystemKeepFree=10%
MaxRetentionSec=30 days

注意: 如果 MaxRetentionSec 设置为 30 天,SystemMaxUse 设置为 5G,journald 将遵守首先达到的限制。如果 5G 限制在 10 天内达到,则清除超过 10 天的日志,覆盖 30 天的保留策略。

实际步骤:应用和验证配置

1. 检查当前日志使用情况

在进行更改之前,检查日志的当前磁盘使用情况:

journalctl --disk-usage

示例输出:

Journals take up 3.4G of disk space.

2. 配置限制

编辑 /etc/systemd/journald.conf(或您的覆盖文件),取消注释/设置所需的指令。例如,确保最大使用 500MB 和 30 天保留:

[Journal]
Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
MaxRetentionSec=30 days

3. 重启日志服务

要使更改生效,必须重启 systemd-journald 服务。这不会影响活动日志记录,但会告诉守护进程立即应用新的大小约束并开始清理过程。

sudo systemctl restart systemd-journald

4. 手动强制清理

如果需要根据新限制立即回收磁盘空间,服务重启通常就足够了。或者,您可以使用 journalctl 显式清理文件。

清理日志以回收空间,只保留最后 500MB:

sudo journalctl --vacuum-size=500M

清理超过 7 天的日志:

sudo journalctl --vacuum-time=7d

关键指令摘要

指令 范围 目的
Storage 全局 定义存储位置(持久、易失、自动)。
SystemMaxUse 持久(/var/log/journal 持久日志的绝对最大总大小。
SystemKeepFree 持久(/var/log/journal 确保保持最小可用磁盘空间。
RuntimeMaxUse 易失(/run/log/journal 易失(运行时)日志的绝对最大总大小。
MaxRetentionSec 两者 定义保留日志的最大年龄。

要点

在日志导致故障之前设置日志限制。对于大多数服务器,在 /etc/systemd/journald.conf.d/ 下使用 drop-in 文件,设置 SystemMaxUse 加上 SystemKeepFree,如果有保留目标则添加 MaxRetentionSec,重启 systemd-journald,并使用 journalctl --disk-usage 确认结果。