journald 的日志去哪了
journald 是 systemd 的日志收集组件:内核与各服务的标准输出都汇到它这里,再由它决定落盘还是只留内存、保留多久、是否转发给 rsyslog。默认配置在低配或高日志量场景下容易出问题——要么重启后日志全丢,要么把根分区写满,要么因为速率限制把关键报错吞掉。这些行为都集中在 /etc/systemd/journald.conf。
基本信息
| 主配置 | /etc/systemd/journald.conf,另有 /etc/systemd/journald.conf.d/*.conf 覆盖 |
|---|---|
| 落盘目录 | /var/log/journal/(persistent 时) |
| 查看日志 | journalctl -u 服务、-b 本次启动、--since/--until |
| 生效方式 | systemctl restart systemd-journald |
| 空间控制 | SystemMaxUse、SystemKeepFree、MaxRetentionSec |
| 速率限制 | RateLimitIntervalSec 与 RateLimitBurst(旧版本参数名不带 Sec) |
典型使用场景
- 排障时发现上次重启前的日志不见了,需要开启持久化存储
- 根分区被日志写满,需要限制 journal 占用上限
- 业务日志量突增时关键报错被限速吞掉,需要调整速率限制
- 合规要求日志集中留存,需要转发到 rsyslog 或远端
- 巡检时统计某个服务的报错趋势
常用配置
常用配置
[Journal]
Storage=persistent # auto 在 /var/log/journal 存在时即持久化;persistent 明确落盘
SystemMaxUse=2G # 日志占用上限,防止写满根分区
SystemKeepFree=1G # 至少保留的空闲空间
MaxRetentionSec=90day # 最长保留时间,按合规要求设定
ForwardToSyslog=yes # 同时转发给 rsyslog,兼容集中审计
RateLimitIntervalSec=30s # 速率限制窗口(旧版本为 RateLimitInterval)
RateLimitBurst=10000 # 窗口内允许的最大条数,超出会被抑制生效与观察
生效与观察
systemctl restart systemd-journald # 改完配置必须重启该服务
journalctl --verify # 校验日志文件完整性,看是否有损坏段
journalctl -u systemd-journald -n 20 --no-pager # 看它自己的启动与告警信息
journalctl --disk-usage # 查看当前日志占用,与上限对比
journalctl -b -1 -n 50 --no-pager # 读上一次启动的日志,排查重启前发生了什么
findmnt /var/log # 确认日志目录所在分区空间充足配置项效果对照
| 配置 | 作用 | 典型问题 |
|---|---|---|
| Storage | 决定内存还是磁盘存储 | volatile 重启即丢,排障时最痛 |
| SystemMaxUse | 日志总量上限 | 过小会导致老日志被很快清理 |
| SystemKeepFree | 保留空闲空间 | 未设置时可能把分区写满 |
| ForwardToSyslog | 转发给 rsyslog | 与 rsyslog 同时留存会有双份占用 |
| RateLimit 两项 | 抑制高频日志 | 调得过紧会吞掉关键报错 |
| MaxRetentionSec | 按时间清理 | 合规场景需与留存要求对齐 |
日志里出现 Suppressed N messages 就是触发了速率限制:先判断是业务在疯狂刷日志还是真的需要更多条数,来源异常时放宽限制只会掩盖问题。
参数名有版本差异:较新版本用 RateLimitIntervalSec 与 RateLimitBurst,较早版本是 RateLimitInterval / RateLimitBurst,配置前按本机版本核对手册。