systemd开启journald日志持久化

在 systemd 体系下,是否能看到“重启前日志”,几乎完全取决于一件事: journald 是否启用了磁盘持久化

CentOS 8 默认是 auto / volatile(内存),一旦 reboot、断电、宿主机重置,证据就蒸发了。

env

  • centos8.x
  • journal

1.journald 持久化的工作机制

  • journald 有两种存储位置

    • 内存:/run/log/journal(重启即消失)
    • 磁盘:/var/log/journal(跨重启保留)
  • 只要 /var/log/journal 存在,systemd 就会自动启用持久化

  • journald.conf 更多是“策略控制”,不是必要条件


2. 生产环境标准操作

2.1 创建持久化目录

1
mkdir -p /var/log/journal

权限通常会自动修正,如果你想显式一点:

1
2
chown root:systemd-journal /var/log/journal
chmod 2755 /var/log/journal

2.2 修改 /etc/systemd/journald.conf

编辑文件:

1
vi /etc/systemd/journald.conf

建议显式配置如下:

1
2
3
4
5
6
7
8
9
10
[Journal]
Storage=persistent
Compress=yes
Seal=yes
SplitMode=uid
SyncIntervalSec=5m
RateLimitIntervalSec=30s
RateLimitBurst=10000
SystemMaxUse=2G
SystemKeepFree=5G

说明几条关键的:

  • Storage=persistent
    明确告诉 systemd:必须落盘
  • Compress=yes
    日志量大时非常重要
  • Seal=yes
    防篡改校验,利于事后取证
  • RateLimit*
    防止异常程序刷爆 journal

2.3 重启 journald 服务

1
systemctl restart systemd-journald

这一步不会丢当前日志,放心用。


3. 验证

3.1 看 journal 使用情况(重启要稍等下,自动刷数据到磁盘)

1
journalctl --disk-usage

如果你看到类似:

Archived and active journals take up 512.0M in the file system.

说明已经在用磁盘了。


3.2 确认日志文件位置

1
ls -ld /var/log/journal

以及:

1
ls /var/log/journal/$(cat /etc/machine-id)/

你应该能看到一堆 .journal 文件。


3.3 模拟一次重启验证

1
reboot

回来后执行:

1
journalctl --list-boots

如果你能看到:

-1  ...
 0  ...

并且:

1
2
journalctl -b -1 | head
journalctl -b -1 -k # -1重启前日志

说明持久化已经 100% 成功