引言
日志是运维的眼睛。现代 Linux 的日志默认由 journald(systemd 的日志守护进程)接管——它以二进制格式存储、自带索引、支持结构化字段过滤,比老式纯文本 syslog 强大得多。本文讲透 journald 日志管理:先理解二进制日志 vs 文本日志的差异,再给 journalctl 的完整查询语法(按时间/服务/级别/字段过滤),接着讲持久化与存储上限、轮转策略、以及与 syslog/远程日志收集的集成,最后给日志容量与性能的最佳实践。
前置:/linux-systemd-services/(unit 与 journalctl -u)。日志分析进阶见 [[observability]]。
目录
- 1. journald 是什么:二进制结构化日志
- 2. journalctl 基础:读日志
- 3. 过滤查询:时间、服务、级别与字段
- 4. 持久化:/var/log/journal
- 5. 存储上限与轮转策略
- 6. 字段与结构化查询:_PID/_HOSTNAME/_SYSTEMD_UNIT
- 7. 与 syslog 集成:rsyslog 转发
- 8. 远程日志收集与集中化
- 9. 常见问题与性能优化
- 10. 速查表
- 延伸阅读
1. journald 是什么:二进制结构化日志
journald = systemd 的日志守护进程,所有 service 的 stdout/stderr 与内核日志统一收进 journal:
内核日志 / 服务 stdout / 服务 stderr / syslog 消息
↓
journald 统一采集
↓
二进制 journal 文件(/run/log/journal 或 /var/log/journal)
↓
journalctl 查询(字段过滤、时间线、级别)
二进制 vs 文本日志:
| 维度 | 传统文本 syslog | journald 二进制 |
|---|---|---|
| 格式 | 纯文本行 | 结构化字段 |
| 索引 | 无 | 自动索引(按时间/字段) |
| 过滤 | grep 字符串 | 字段级精确查询 |
| 元数据 | 少 | 丰富(PID/UID/unit/时间戳) |
| 时间精度 | 秒 | 微秒 |
| 查看 | cat/tail | journalctl |
心智:journald 的日志是「数据库」不是「文件」——别用 grep 翻文本,用 journalctl 的字段查询。
2. journalctl 基础:读日志
最常用的读法:
journalctl # 全部日志(可能很长)
journalctl -n 50 # 最后 50 行
journalctl -f # 跟随实时输出(类似 tail -f)
journalctl --no-pager # 不分页输出
journalctl -n 20 -o short-iso # 输出格式:带 ISO 时间戳
输出格式:
journalctl -o short # 默认简短
journalctl -o json # JSON 结构化
journalctl -o short-iso # ISO 8601 时间
journalctl -o verbose # 显示全部字段
关注某服务:
journalctl -u nginx.service # nginx 的日志
journalctl -u nginx -u mysql # 多个服务
journalctl -u nginx -f # 实时跟随
记忆:journalctl 三件套——
-u选服务、-n限量、-f跟随——日常排错从这三步开始。
3. 过滤查询:时间、服务、级别与字段
按时间过滤:
journalctl --since "2026-09-28 09:00:00" # 从某时刻
journalctl --since yesterday # 昨天
journalctl --since "1 hour ago" # 最近 1 小时
journalctl --since "2026-09-01" --until "2026-09-05"
journalctl -u nginx --since today # 今天某服务
按优先级/级别:
journalctl -p err # 只看错误级(err 及以上)
journalctl -p warning # warning 及以上
journalctl -p info -p err -u app # 组合
# 优先级:emerg alert crit err warning notice info debug
按服务 + 时间 + 级别组合:
journalctl -u myapp --since "30 min ago" -p err -n 50 --no-pager
记忆:journalctl 过滤就是「时间 + 服务 + 级别」的三维切片——排错时先缩时间窗、再锁服务、再压级别。
4. 持久化:/var/log/journal
journald 默认把日志存在内存(/run/log/journal)——重启即失。要持久化需启用 /var/log/journal:
# 创建持久化目录(自动启用持久化)
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
验证持久化:
ls /var/log/journal/<machine-id>/ # 出现持久 journal 文件
du -sh /var/log/journal
为什么默认不持久化:
内存 journal:写入快、不磨损磁盘
但重启丢失 → 排错时「找不到上次崩溃日志」很痛苦
生产服务器:几乎都应启用持久化
铁律:生产环境一定要持久化 journal——否则崩溃重启后所有日志清零,故障定位无从下手。
5. 存储上限与轮转策略
journal 大小默认受限(避免写爆磁盘)——配置在 /etc/systemd/journald.conf:
[Journal]
# 存储位置:persistent / volatile / auto
Storage=persistent
# 日志最大大小(默认 4G 的 SystemMaxUse)
SystemMaxUse=2G
SystemMaxFileSize=64M
SystemKeepFree=1G
# 按大小轮转
SystemMaxFiles=8
# 强制压缩
Compress=yes
常用配置项:
| 配置 | 含义 | 建议 |
|---|---|---|
| Storage=persistent | 持久化 | 生产启用 |
| SystemMaxUse | 日志总上限 | 2G-10G |
| SystemMaxFileSize | 单文件上限 | 64M-128M |
| SystemKeepFree | 保留磁盘余量 | 1G |
| MaxRetentionSec | 按时间保留 | 如 1month |
| Compress | 压缩(xz/zstd) | 开启 |
改完生效:
sudo systemctl restart systemd-journald
记忆:journal 也有「轮转」——按总大小/单文件/时间三重限制——
SystemMaxUse是总闸,防止日志吃满磁盘。
6. 字段与结构化查询:_PID/_HOSTNAME/_SYSTEMD_UNIT
journal 每条日志自带结构化字段——_ 前缀是系统字段:
_PID 进程 ID
_UID 用户 ID
_HOSTNAME 主机名
_SYSTEMD_UNIT 来源 unit
_MACHINE_ID 机器 ID
_BOOT_ID 启动 ID(区分本次开机)
__REALTIME_TIMESTAMP 时间戳
按字段过滤:
# 按进程
journalctl _PID=1234
# 按来源 unit
journalctl _SYSTEMD_UNIT=nginx.service
# 按启动周期(只看本次开机)
journalctl -b 0
# 看上次开机
journalctl -b -1
# 某字段是否存在
journalctl _HOSTNAME=web-01 --since today
字段结合查询:
# 某 PID 在本次开机内的错误
journalctl -b 0 _PID=1234 -p err
记忆:
_字段是 journal 的「索引列」——按_PID、_SYSTEMD_UNIT、-b开机号过滤,比字符串 grep 精准一个量级。
7. 与 syslog 集成:rsyslog 转发
有些老工具/系统只认 syslog——journald 可以双向桥接:
journald → rsyslog(导出给传统栈):
# 1. 确保 rsyslog 在跑
systemctl status rsyslog
# 2. journald 自动转发 syslog 消息(默认已配 imjournal 模块)
# /etc/rsyslog.conf 里:
module(load="imjournal" StateFile="imjournal.state")
# 3. 传统 /var/log/syslog 会收到 journal 中标记为 syslog 的消息
应用直接写 journald(用 systemd 的 sd_journal API):
// C:用 sd_journal_print 写结构化日志
#include <systemd/sd-journal.h>
sd_journal_send("MESSAGE=Hello World",
"PRIORITY=6",
"APP=myapp",
NULL);
或 Python(systemd 日志接口):
import systemd.journal
journal.send('app starting', PRIORITY=6, APP='myapp')
记忆:journald 是「统一的收集端」,syslog 是「老接口」——传统工具读 syslog 文件、新工具直接 journalctl,两者可桥接。
8. 远程日志收集与集中化
多服务器日志集中的两条路:
① journald 原生远程转发(systemd-journal-remote):
# 收集端(server A)
sudo systemctl enable systemd-journal-remote.socket
# 发送端(client)
journalctl --output=export | systemd-journal-remote --output=/var/log/journal/hostname
② 转发到日志分析平台(更常用):
# filebeat(ELK)从 journal 采日志
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: journald
seek: tail
output.elasticsearch:
hosts: ["log-server:9200"]
| 方案 | 适合 | 代价 |
|---|---|---|
| journald 远程 | 小规模 | 需逐台配 |
| ELK/Loki | 大规模 | 需搭建平台 |
| 云日志(AWS/SLS) | 云上 | 需网关 |
记忆:日志集中化两条路——原生 journal 转发(轻)或接入 ELK/Loki(重但可检索)——规模上来必走集中平台。
9. 常见问题与性能优化
journald 常见坑:
| 问题 | 原因 | 解法 |
|---|---|---|
| 重启日志丢失 | 未持久化 | 建 /var/log/journal |
| 日志占满磁盘 | SystemMaxUse 未设 | 限大小 + KeepFree |
| 查询慢 | 文件过多/过大 | 限 SystemMaxFileSize |
| 高 IO 写入 | 每行 fsync | 关 sync 或限 RateLimit |
| 时间戳乱 | 时钟漂移 | NTP 同步 |
性能调优:
[Journal]
# 高频日志限速(防日志风暴)
RateLimitIntervalSec=5s
RateLimitBurst=10000
# 及时落盘(性能换可靠性)
SyncIntervalSec=5m
容量巡检:
journalctl --disk-usage # 当前占用
journalctl --vacuum-size=1G # 删到 1G 以内
journalctl --vacuum-time=7d # 只留 7 天
journalctl --vacuum-files=5 # 只留 5 个文件
记忆:journald 调优三件事——持久化(保真)、限大小(防爆)、限速(防风暴)——真空三剑客随时瘦身。
10. 速查表
| 需求 | 做法 |
|---|---|
| 看全部日志 | journalctl |
| 看服务日志 | journalctl -u nginx |
| 实时跟随 | journalctl -f |
| 时间过滤 | --since "1 hour ago" |
| 级别过滤 | -p err |
| 按字段 | _PID=1234 / _SYSTEMD_UNIT=xx |
| 本次开机 | -b 0 |
| 持久化 | mkdir /var/log/journal + 重启 |
| 限大小 | SystemMaxUse=2G |
| 瘦身 | --vacuum-size=1G / --vacuum-time=7d |
| 转发平台 | filebeat journald input → ELK/Loki |
一句话记忆:journald 用二进制结构化存储日志、自带字段索引;journalctl 按「时间 + 服务 + 级别 + _字段」切片查询;生产必须持久化到 /var/log/journal、用 SystemMaxUse 限大小防爆盘、RateLimit 防日志风暴;集中化走 journal 转发或 ELK/Loki——日志三分靠采集、七分靠查询。
延伸阅读
- /linux-systemd-services/ — systemctl 与 journalctl -u
- /linux-performance-tuning/ — 磁盘 IO 与性能监控
- [[observability]] — 日志、指标、追踪全景
- [[security]] — 日志审计与安全
- [[infra]] — ELK/Loki 日志平台
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。