配置 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=persistent或Storage=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 |
持久日志数据的最大大小。 | 500M 或 2G |
示例配置:
将持久日志存储限制为最大 1 千兆字节:
[Journal]
SystemMaxUse=1G
SystemKeepFree(磁盘安全缓冲区)
虽然 SystemMaxUse 设置了上限,但 SystemKeepFree 作为关键的安全措施。它指定包含日志文件的文件系统上应保持的最小可用磁盘空间。
如果可用空间低于 SystemKeepFree 值,journald 将清理日志,即使尚未达到 SystemMaxUse 限制。这可以防止日志增长完全填满磁盘并停止关键系统操作。
| 指令 | 描述 | 示例值 |
|---|---|---|
SystemKeepFree |
日志文件系统所需的最小可用空间。 | 10% 或 4G |
最佳实践: 强烈建议同时设置 SystemMaxUse 和 SystemKeepFree。对于大驱动器,使用百分比 (%) 作为 SystemKeepFree 以获得更好的可扩展性。
RuntimeMaxUse(易失存储限制)
如果您使用易失存储(/run/log/journal),或者即使启用了持久存储也想控制内存/tmpfs 使用,请使用 RuntimeMaxUse。这控制易失日志文件使用的磁盘空间,这些文件是临时的,驻留在内存或 tmpfs 中。
| 指令 | 描述 | 示例值 |
|---|---|---|
RuntimeMaxUse |
易失日志数据的最大大小。 | 300M |
实施时间限制以保留日志
基于大小的限制确保磁盘空间得到维护,但不能保证日志的年龄。如果日志量低,日志可能无限期保留。基于时间的限制确保日志在特定持续时间后被轮转,无论总大小如何。
MaxRetentionSec
此指令指定日志应保留的最长时间。任何早于此持续时间的日志将被自动清除,补充大小限制。
| 指令 | 描述 | 示例值 |
|---|---|---|
MaxRetentionSec |
保留日志的最大年龄。 | 30 days、1 month、2 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 确认结果。