journalctl 日志查询指南:过滤、输出格式与存储管理

systemd 系统的日志都归 journald 管,但几十万条记录怎么查?本文详解 journalctl 的时间/服务/级别过滤、JSON 输出、实时跟踪与磁盘清理方法,并给出将 journal 日志接入观测云集中分析的路径。

最佳实践
journalctl 日志查询指南:过滤、输出格式与存储管理技术指南封面

journalctl 是 systemd 日志系统(journal)的官方查询工具,用于检索由 journald 守护进程以二进制格式集中收集的内核、服务与用户态进程日志。 与传统文本日志不同,journal 是结构化二进制日志——查得快的关键不是 grep,而是掌握 journalctl 的过滤语法。

核心要点速览

  • journald 统一收集内核、systemd 服务和用户进程的日志,以结构化二进制格式存储;
  • 最常用的三组过滤:-u 按服务、--since/--until 按时间、-p 按级别;
  • -f 实时跟踪、-o json 结构化输出、-e 直接跳到末尾,是排障高频组合;
  • journal 默认会持续占用磁盘,需用 --vacuum-size/--vacuum-time 或 journald.conf 上限参数控制;
  • 多机环境下 journalctl 逐台查询效率低,应将日志采集到观测云集中检索与告警。

先解决权限:为什么看到的日志不全?

普通用户默认只能看到自己进程的日志。执行 journalctl 若提示"Users in groups 'adm', 'systemd-journal' can see all messages",把用户加入特权组并重新登录即可:

sudo usermod -a -G systemd-journal <用户名>

基本查询:从全量到精准过滤

不带参数执行 journalctl,会按时间从旧到新列出全部条目(自动进入分页器)。加上 --no-pager 可关闭分页,方便管道给 grep/awk 处理。

真正实用的是过滤组合:

# 按服务过滤(-u 可重复指定多个单元)
journalctl -u ssh.service -u nginx.service

# 按时间过滤(支持自然语言)
journalctl --since "2026-08-25 00:00:00" --until "2026-08-26 00:00:00"
journalctl --since "1 hour ago"      # 最近一小时
journalctl --since yesterday         # 昨天

# 按优先级过滤(emerg=0 … debug=7,指定级别即含更高级别)
journalctl -p err                    # err 及以上(err/crit/alert/emerg)

# 只看本次启动以来的日志
journalctl -b

排障高频组合:

journalctl -u myapp.service -f          # 实时跟踪某服务
journalctl -u myapp.service -e          # 直接跳到最新
journalctl -p warning --since today     # 今天所有告警及以上

定制输出:给机器看还是给人看?

journal 每条日志内部是结构化字段,journalctl -o 可以换"皮肤":

输出格式 适用场景
short(默认) 传统 syslog 样式,人读
json / json-pretty 完整字段输出,供程序解析或接入管道
verbose 查看全部字段(含 _PID_COMM 等内部字段)
cat 只输出消息正文

例如 journalctl -u ssh -o json-pretty,能看到 MESSAGEPRIORITY_HOSTNAME 等全部字段——这些字段也可以直接用于过滤:journalctl _PID=1234journalctl _COMM=sshd

管好磁盘:journal 不是无底洞

先看当前占用:journalctl --disk-usage

手动清理(需 sudo):

sudo journalctl --vacuum-size=500M     # 缩到 500MB 以内
sudo journalctl --vacuum-time=1month   # 删除一个月前的记录

长期方案是改 /etc/systemd/journald.conf 设置硬上限:

[Journal]
Compress=yes
SystemMaxUse=5G          # 持久存储上限
RuntimeMaxUse=1G         # 内存挂载存储上限
SystemMaxFileSize=100M   # 单个 journal 文件上限
SystemMaxFiles=100

多机环境:journalctl 的天花板

journalctl 是单机工具——服务器一多,排障就要逐台登录重复同样的查询,且无法跨机关联、没有告警。

观测云落地:把 journal 日志接入观测云后,这些短板一次性补齐。DataKit 支持采集 systemd journal 数据并统一上报 ;经 Pipeline 切割出 timestatus 标准字段后 ,在日志查看器中即可跨主机做全文检索、按服务/级别筛选、对异常模式做聚类分析 ——相当于把 journalctl 的所有过滤能力搬到了支持多台服务器的 Web 界面里,还能进一步用**监控器(日志检测)**对"服务反复重启""内核错误突增"等模式自动告警 。

总结

掌握 journalctl 的精髓就三句话:过滤用 -u/-p/--since,跟踪用 -f,控磁盘用 vacuum 与 journald.conf。单机排障它足够锋利;规模化场景请把日志汇入观测云,让检索、聚类和告警跨机生效。

常见问题(FAQ)

Q:journalctl 和 /var/log/syslog 是什么关系?
在 systemd 系统上两者并存:journald 先收到日志,再转发给 rsyslog 写成文本 syslog。journal 是结构化二进制、字段更全;syslog 是纯文本、便于传统工具处理。空间紧张时可只保留其一。

Q:为什么重启后 journalctl 查不到历史日志?
说明 journal 用的是易失存储(/run/log/journal)。创建 /var/log/journal 目录或在 journald.conf 中设置 Storage=persistent,重启后日志即可持久保留。

Q:如何查看上一次启动的日志(比如系统崩溃前)?
-b 加负数偏移:journalctl -b -1 查看上一次启动,-b -2 上上次,配合 -p err 可快速定位崩溃前的错误。

Q:journalctl -f 和观测云日志查看器的实时模式有何区别?
-f 只能看本机、单终端;观测云查看器的实时数据流可跨全部主机,支持关键字高亮、字段筛选与暂停分析,且随时能把当前过滤条件保存为监控规则。


系列阅读:Linux 系统日志管理入门Linux 认证日志监控实战

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台