journalctl是查看systemd日志的唯一可靠入口,/var/log/下文本日志仅为rsyslog转发副本;其日志模式由journald.conf中Storage=等参数决定,需结合journalctl --disk-usage、systemctl status及配置文件验证实际状态。

journalctl 是查看 systemd 系统日志模式详情的唯一可靠入口,/var/log/ 下的文本日志只是 rsyslog 或 syslog-ng 的转发副本,不反映实际日志采集机制。
journalctl 能查到哪些日志模式细节
systemd 日志默认采用内存+环形缓冲区模式,是否落盘、保留时长、大小配额等都由 journald.conf 控制。直接运行 journalctl --help 会列出所有支持的过滤和输出选项,但不会显示当前配置值;要查真实模式,得看配置和状态。
-
journalctl --disk-usage:显示当前 journald 占用磁盘空间(若启用持久化) -
journalctl --verify:检查日志文件完整性,失败说明日志已损坏或未启用持久化 -
sudo systemctl status systemd-journald:确认服务是否 active,以及启动时是否报Journal file not found类警告 -
sudo cat /etc/systemd/journald.conf | grep -v "^#" | grep -v "^$":提取非注释的有效配置行,重点关注Storage=、MaxUse=、RuntimeMaxUse=
Storage= 配置决定日志是否落地到 /var/log/journal
Storage= 是核心开关,它有四个合法值:volatile(仅内存)、persistent(写入 /var/log/journal)、auto(存在 /var/log/journal 目录则用 persistent,否则 fallback 到 volatile)、none(完全禁用 journald)。多数发行版默认是 auto,但若该目录不存在,实际就是 volatile 模式——重启后日志全丢。
- 执行
ls /var/log/journal,若提示No such file or directory,说明当前是 volatile 模式 - 执行
sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald后,journalctl --disk-usage才会返回非零值 -
Storage=persistent必须配合 root 权限创建目录,普通用户mkdir不生效
为什么 journalctl -o json 输出里没有时间戳字段
不是日志没时间,而是 -o json 默认只输出原始结构字段,__REALTIME_TIMESTAMP 和 __MONOTONIC_TIMESTAMP 是二进制整数(微秒级),需加 --all 才强制展开所有元数据字段。更实用的是 -o json-pretty,它自动补全可读时间字段 __REALTIME_TIMESTAMP 并转为 ISO8601 格式。
- 错:
journalctl -o json | head -n1→ 时间字段缺失 - 对:
journalctl -o json-pretty -n1→ 包含"__REALTIME_TIMESTAMP": "1712345678901234"及自动解析的"_SOURCE_REALTIME_TIMESTAMP" - 若需 Unix 时间戳秒级,用
journalctl -o export | head -n1 | awk -F'=' '/^__REALTIME_TIMESTAMP/{print int($2/1000000)}'
rsyslog 转发的日志和 journalctl 输出不一致怎么办
这是常见误判点:rsyslog 从 journald 读取日志是异步、带缓冲的,且默认只转发 level >= warning 的条目。即使 journalctl 显示大量 info 级日志,/var/log/syslog 也可能为空或条目更少。
- 检查 rsyslog 是否启用 journald 输入模块:
grep -i "imjournal" /etc/rsyslog.conf,应有$ModLoad imjournal - 确认 rsyslog 配置了完整级别转发:
$IMJournalRatelimitInterval 0和$IMJournalRatelimitBurst 0防止丢日志 - 对比时间范围:
journalctl --since "2026-07-07 20:00" | wc -lvsgrep "Jul 7 20:" /var/log/syslog | wc -l,差值大说明转发延迟或过滤过严 - 临时停掉 rsyslog:
sudo systemctl stop rsyslog,再跑journalctl -n100,若内容明显增多,说明 rsyslog 是瓶颈
journald.conf 的 Storage 和 ForwardToSyslog 组合,而不是你打开哪个文件。很多运维在 /var/log/messages 里找不到某条日志,是因为它根本没被 rsyslog 拉过去——先查 journalctl,再查转发链路,别倒着来。


















