简介
systemd具有自己的日志记录系统,称作日记。日记本身是systemd管理的系统服务,全名为systemd-journald.service。它会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和存储日志记录数据
BMC 系统采用systemd-journald作为日志收集后端,通过 journal_export.service 将结构化日志实时导出为文本文件,再由 logrotate 定时对日志文件进行大小控制和历史归档,形成完整的"采集 → 导出 → 轮转"日志管道。
journald (内存/volatile)
│
│ journalctl -f (实时跟踪)
▼
/var/log/journalctl.log
│
│ logrotate (每 6 分钟检查)
▼
/var/log/journalctl.log.1 ~ .4 (历史归档,权限 0400)一、journald 日志收集配置
配置文件:/etc/systemd/journald.conf
存储策略
| 参数 | 值 | 说明 |
|---|---|---|
Storage | volatile | 仅使用内存(/run/log/journal)存储,断电不持久化 |
RuntimeMaxUse | 2M | 运行时日志目录总大小上限 |
RuntimeMaxFileSize | 2M | 单个日志文件最大 2MB |
RuntimeMaxFiles | 1 | 最多保留 1 个日志文件 |
SystemMaxUse | 2M | 持久化存储(如有)总大小上限 |
SystemMaxFileSize | 2M | 持久化单文件最大 2MB |
SystemMaxFiles | 1 | 持久化最多保留 1 个日志文件 |
说明:使用
volatile模式的目的是将日志写入内存而非 Flash 存储,避免频繁写入损耗 BMC 的存储介质。实际持久化工作由journal_export.service负责写入文本文件。
限速配置
| 参数 | 值 | 说明 |
|---|---|---|
RateLimitIntervalSec | 86400s | 限速统计窗口(24 小时) |
RateLimitBurst | 720 | 窗口内最多接受 720 条日志 |
SyncIntervalSec | 5m | 日志刷盘间隔 |
转发配置
| 参数 | 值 | 说明 |
|---|---|---|
ForwardToSyslog | no | 不转发到 syslog |
ForwardToWall | no | 不广播到所有终端 |
ReadKMsg | no | 不读取内核 /dev/kmsg 消息 |
二、日志导出服务
配置文件:/etc/systemd/system/journal_export.service
工作原理
服务启动后调用 journalctl -f 持续跟踪 journald 日志流,并将每一条日志以 short-iso 格式追加写入 /var/log/journalctl.log。
[Service]
StandardOutput=append:/var/log/journalctl.log
ExecStartPre=/bin/bash -c 'if [ -d /var/log/journal ]; then find /var/log/journal -mindepth 1 -delete; fi'
ExecStart=/bin/journalctl -f \
--cursor-file=/run/journal_export.cursor \
-o short-iso关键特性
Cursor 断点续读
journalctl 使用 --cursor-file=/run/journal_export.cursor 记录已读取的位置。服务重启后会从上次断点继续,不会重复导出已写入的日志,也不会遗漏服务停止期间新产生的日志。
启动前清理持久化日志
ExecStartPre 会删除 /var/log/journal 目录下的所有内容,确保 journald 不在磁盘上保留冗余的二进制日志文件(与 Storage=volatile 配合使用)。
日志格式(short-iso)
输出示例:
2026-04-17T10:23:45+0800 hostname systemd[1]: Started journal_export.service.格式为:ISO 8601 时间戳 主机名 进程名[PID]: 消息内容
故障自动恢复
| 参数 | 值 | 说明 |
|---|---|---|
Restart | on-failure | 异常退出后自动重启 |
RestartSec | 3s | 重启等待间隔 |
StartLimitBurst | 5 | 60 秒内最多重启 5 次 |
StartLimitIntervalSec | 60s | 重启次数统计窗口 |
三、日志轮转机制
3.1 journalctl.log 轮转规则
配置文件:/etc/logrotate.d/frame(节选)
/var/log/journalctl.log {
su root root
size = 2048k
nocompress
copytruncate
rotate 4
prerotate
/etc/prerotate.sh "$1"
endscript
lastaction
chmod 0400 /var/log/journalctl.log.*.gz 2>/dev/null || true
endscript
}| 参数 | 值 | 说明 |
|---|---|---|
size | 2048k(2MB) | 文件超过此大小时触发轮转 |
nocompress | — | 历史文件不压缩,保留原始文本便于直接查看 |
copytruncate | — | 复制文件内容后截断原文件,无需重启 journal_export.service |
rotate | 4 | 最多保留 4 个历史文件(.1~.4) |
四、常用命令
# 查看 journal_export 服务状态
systemctl status journal_export.service
# 实时查看导出的日志
tail -f /var/log/journalctl.log