限制 systemd 服务日志量需从全局配置、服务级覆盖、定时 vacuum 三方面协同:修改 /etc/systemd/journald.conf 设 systemmaxuse、systemmaxfilesize 等参数并重启 journald;为特定服务(如 nginx.service)用 systemctl edit 添加 logratelimitintervalsec/logratelimitburst;再通过 cron 定期执行 journalctl --vacuum-size 和 --vacuum-time 清理。

限制 systemd 服务生成的日志量,核心是控制 journald 对该服务日志的存储行为——不是限制服务本身“写多少”,而是限制 journald “存多少”。这需从全局配置、服务级覆盖、清理机制三方面协同实现。
修改全局 journald 配置设硬性上限
编辑 /etc/systemd/journald.conf,在 [Journal] 段落中启用以下参数:
-
SystemMaxUse=500M:限定所有持久化日志(
/var/log/journal/)总大小,推荐 200M–1G,视服务器用途调整 - SystemMaxFileSize=100M:单个日志文件最大体积,避免单文件过大影响 vacuum 效率
- MaxRetentionSec=30day:日志最长保留 30 天,超时自动淘汰(注意:需配合 vacuum 触发)
- SystemKeepFree=1G:强制保留至少 1GB 空闲磁盘空间,防系统因日志写满而卡死
保存后必须执行 sudo systemctl restart systemd-journald 才生效。运行 journalctl --disk-usage 可验证当前占用和策略是否加载。
为特定服务单独设置日志配额
若只想限制某个服务(如 nginx.service)的日志量,可在其 unit 文件中添加日志控制项:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 编辑服务文件:
sudo systemctl edit nginx.service - 填入以下内容:
[Service] # 限制该服务日志最多占 50MB(仅对本服务有效) LogRateLimitIntervalSec=30 LogRateLimitBurst=1000 # 可选:禁用该服务日志(极端情况) # StandardOutput=null # StandardError=null
-
LogRateLimitBurst表示 30 秒内最多记录 1000 条日志;超出部分被丢弃(不写入 journal) - 保存后重载配置:
sudo systemctl daemon-reload,再重启服务生效
配合定时 vacuum 防止策略延迟生效
journald 的时间与空间策略不会实时清理,需靠 vacuum 触发。建议加 cron 定期执行:
- 创建清理脚本
/root/bin/journal-clean.sh: #!/bin/bash<br>journalctl --vacuum-size=400M --vacuum-time=14d > /dev/null 2>&1
- 赋予执行权限:
chmod +x /root/bin/journal-clean.sh - 添加定时任务(每 6 小时一次):
0 */6 * * * /root/bin/journal-clean.sh
这样即使突发日志写入导致短暂超限,也能快速回落到设定范围内。
验证与常见避坑点
执行以下命令确认效果:
-
journalctl -u nginx --disk-usage:查看该服务专属日志占用(需 v249+) -
journalctl --list-boots:检查是否有多次启动记录,确认持久化已启用 -
ls -lh /var/log/journal/*/system.journal:观察单个文件大小是否受控
注意:不要手动删除 .journal 文件;journalctl --vacuum-size 是一次性命令,不能替代配置;若改完配置没生效,一定是忘了重启 systemd-journald 服务。










