journal日志详解
更新时间: 2026/04/17
在Gitcode上查看源码

简介

systemd具有自己的日志记录系统,称作日记。日记本身是systemd管理的系统服务,全名为systemd-journald.service。它会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和存储日志记录数据

BMC 系统采用systemd-journald作为日志收集后端,通过 journal_export.service 将结构化日志实时导出为文本文件,再由 logrotate 定时对日志文件进行大小控制和历史归档,形成完整的"采集 → 导出 → 轮转"日志管道。

text
 journald (内存/volatile)

        │  journalctl -f (实时跟踪)

 /var/log/journalctl.log

        │  logrotate (每 6 分钟检查)

 /var/log/journalctl.log.1 ~ .4  (历史归档,权限 0400)

一、journald 日志收集配置

配置文件/etc/systemd/journald.conf

存储策略

参数说明
Storagevolatile仅使用内存(/run/log/journal)存储,断电不持久化
RuntimeMaxUse2M运行时日志目录总大小上限
RuntimeMaxFileSize2M单个日志文件最大 2MB
RuntimeMaxFiles1最多保留 1 个日志文件
SystemMaxUse2M持久化存储(如有)总大小上限
SystemMaxFileSize2M持久化单文件最大 2MB
SystemMaxFiles1持久化最多保留 1 个日志文件

说明:使用 volatile 模式的目的是将日志写入内存而非 Flash 存储,避免频繁写入损耗 BMC 的存储介质。实际持久化工作由 journal_export.service 负责写入文本文件。

限速配置

参数说明
RateLimitIntervalSec86400s限速统计窗口(24 小时)
RateLimitBurst720窗口内最多接受 720 条日志
SyncIntervalSec5m日志刷盘间隔

转发配置

参数说明
ForwardToSyslogno不转发到 syslog
ForwardToWallno不广播到所有终端
ReadKMsgno不读取内核 /dev/kmsg 消息

二、日志导出服务

配置文件/etc/systemd/system/journal_export.service

工作原理

服务启动后调用 journalctl -f 持续跟踪 journald 日志流,并将每一条日志以 short-iso 格式追加写入 /var/log/journalctl.log

ini
[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)

输出示例:

shell
2026-04-17T10:23:45+0800 hostname systemd[1]: Started journal_export.service.

格式为:ISO 8601 时间戳 主机名 进程名[PID]: 消息内容

故障自动恢复

参数说明
Restarton-failure异常退出后自动重启
RestartSec3s重启等待间隔
StartLimitBurst560 秒内最多重启 5 次
StartLimitIntervalSec60s重启次数统计窗口

三、日志轮转机制

3.1 journalctl.log 轮转规则

配置文件/etc/logrotate.d/frame(节选)

text
/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
}
参数说明
size2048k(2MB)文件超过此大小时触发轮转
nocompress历史文件不压缩,保留原始文本便于直接查看
copytruncate复制文件内容后截断原文件,无需重启 journal_export.service
rotate4最多保留 4 个历史文件(.1.4

四、常用命令

bash
# 查看 journal_export 服务状态
systemctl status journal_export.service

# 实时查看导出的日志
tail -f /var/log/journalctl.log