第 8 章 · 02 `journalctl`:统一日志查询


文档摘要

第 8 章 · 02 :统一日志查询 本节摘要:systemd 把所有服务的日志统一收进 journald,用 一条命令就能查全部——不用再满世界找 。本节要讲清 的核心用法:按服务查( )、实时跟踪( ,类似 )、按时间范围( )、按级别( )、跳到末尾( )。掌握它,服务出问题时你能一秒钟看到所有相关日志,而不是在 里翻半天。 内容来源:综合 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 查某服务的日志。 用 实时跟踪日志(类似 )。 用 / 按时间范围过滤。 用 按日志级别过滤(error/warning/info 等)。 用 跳到末尾、 只看最近 N 行。 理解 journald 与传统 文件日志的关系与取舍。

第 8 章 · 02 journalctl:统一日志查询

本节摘要:systemd 把所有服务的日志统一收进 journald,用 journalctl 一条命令就能查全部——不用再满世界找 /var/log/xxx.log。本节要讲清 journalctl 的核心用法:按服务查(-u)、实时跟踪(-f,类似 tail -f)、按时间范围(--since)、按级别(-p err)、跳到末尾(-e)。掌握它,服务出问题时你能一秒钟看到所有相关日志,而不是在 /var/log 里翻半天。

内容来源:综合 journalctl 知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. journalctl -u 服务名 查某服务的日志。
  2. -f 实时跟踪日志(类似 tail -f)。
  3. --since/--until 按时间范围过滤。
  4. -p err 按日志级别过滤(error/warning/info 等)。
  5. -e 跳到末尾、-n N 只看最近 N 行。
  6. 理解 journald 与传统 /var/log 文件日志的关系与取舍。

一、设计动机:为什么需要统一日志

传统的 Linux 日志是「各自为政」的:每个服务往自己的日志文件写(/var/log/nginx/error.log/var/log/mysql/error.log...),格式不一、位置不一、轮转策略不一。排查一个问题要在多个文件间跳来跳去,还要处理 logrotate 把日志压缩归档的问题。

systemd 的 journald 提供了「统一日志收集」:所有服务(甚至内核、PAM、cron)的日志,统一收进一个二进制日志库(/var/log/journal//run/log/journal/),用 journalctl 一条命令统一查。好处:

  • 统一接口:不管哪个服务,journalctl -u 名字 都能查。
  • 结构化:日志带元数据(时间、服务、级别、PID),可按任意维度过滤。
  • 关联:能查「某次启动以来的日志」「某次服务失败的上下文」。

二、高频组合与实战

按服务查

journalctl -u nginx # 查 nginx 所有日志 journalctl -u nginx -u mysql # 同时查多个服务

-u(unit)是最常用的过滤,把日志限定到某个服务。

实时跟踪

journalctl -u nginx -f # -f: 实时跟踪(类似 tail -f), Ctrl+C 退出

排查「重启服务后实时看日志」的标准操作:一个终端 systemctl restart nginx,另一个终端 journalctl -u nginx -f

按时间范围

journalctl --since "1 hour ago" # 最近 1 小时 journalctl --since today # 今天以来 journalctl --since "2026-08-04 09:00" --until "2026-08-04 10:00" # 指定区间 journalctl -u nginx --since "30 min ago" # 与 -u 组合

按级别

journalctl -p err # 只看 error 及更严重 journalctl -p warning -u nginx # nginx 的 warning 及以上 journalctl -p debug # 所有(含 debug, 量很大)

级别从宽到严:debug < info < notice < warning < err < crit < alert < emerg。-p err 表示「err 及更严重」。

看最近的 / 跳到末尾

journalctl -e # -e: 跳到末尾(看最近的) journalctl -n 50 # 最近 50 行 journalctl -n 50 -u nginx --no-pager # 不分页(脚本/管道里常用)

看本次启动 / 上次启动

journalctl -b # 本次启动以来的日志 journalctl -b -1 # 上次启动(-1, 前一次) journalctl --list-boots # 列出所有启动记录

-b 系列特别有用——排查「上次启动时出了什么问题」不用翻旧文件,直接 -b -1

三、踩坑与排错

坑 1:分页器困住你

journalctl -u nginx # 默认用 less 分页, 按 q 退出 journalctl --no-pager -n 50 # 脚本/管道里加 --no-pager, 否则卡住

交互式用默认分页(可搜索 /keyword);脚本或管道里务必 --no-pager

坑 2:日志只保留本次启动(默认在某些发行版)

某些发行版默认把 journal 存 /run/log/journal(内存),重启即丢。要看跨重启的日志,需配置「持久化」:存 /var/log/journal(磁盘)。检查:

ls /var/log/journal/ # 有内容说明持久化开了 # 没开的话: sudo mkdir -p /var/log/journal sudo systemctl restart systemd-journald

坑 3:权限——看不到别人的服务日志

journalctl -u nginx # 普通用户可能看不到全部 sudo journalctl -u nginx # sudo 看全

某些日志只 root/adm 组能看。排查系统服务务必 sudo。

坑 4:与 /var/log 的关系

journald 不是「取代」/var/log,而是「补充」。很多服务同时往 journald 和自己的文件写(/var/log/nginx/)。journalctl 的优势是「跨服务统一查」,传统文件日志的优势是「格式稳定、工具丰富(awk/grep)」。两者并存,按需用。

本节要点回顾

  1. journald 统一收集所有服务日志,用 journalctl 一条命令跨服务查,不用满世界找文件。
  2. 核心过滤:-u 服务(按服务)、--since/--until(时间)、-p err(级别)、-b(本次/上次启动)。
  3. -f 实时跟踪(类似 tail -f)、-e 跳末尾、-n N 看 N 行。
  4. 脚本/管道加 --no-pager,否则默认 less 分页会卡住。
  5. 持久化:默认某些发行版日志存内存重启即丢,配 /var/log/journal 持久化。
  6. /var/log 并存:journald 统一查、文件日志格式稳定,按需选择。

下一节讲 systemd 的「单元模型」——服务(.service)只是它管理的众多类型之一。


发布者: 作者: 灏天文库 转发
评论区 (0)
U