揭秘 journalctl:您的 Linux 系统日志指南

掌握 systemd 的 `journalctl` 实用工具,以有效查看、过滤和分析 Linux 系统日志。本指南涵盖了实时监控、基于时间的查询、隔离服务单元日志以及管理日志磁盘使用情况以进行强大故障排除的基本命令。

30 浏览量

解读 journalctl:您的 Linux 系统日志指南

journalctl 工具是查看和分析由 systemd 日志系统管理的结构化日志的核心命令。作为许多 Linux 发行版中日志记录的现代标准,理解 journalctl 对于有效的系统管理、服务管理,尤其是故障排除至关重要。

与传统的基于文本的日志文件(如 /var/log 中的文件)不同,systemd 将日志捕获为二进制、索引格式。这允许根据时间、服务、启动 ID 等进行强大的查询。本指南将引导您了解解锁系统历史和实时事件全部潜力所需的基本命令。


理解 Systemd 日志 (Journal)

在深入研究命令之前,了解 journalctl 管理的内容会有所帮助。systemd 日志会收集来自内核、服务(单元)、应用程序甚至系统启动过程的日志。这些日志通常存储在结构化的二进制文件中,使其比传统的平面文件更快地进行搜索和过滤。

关键概念:

  • 持久性 (Persistence): 可以配置日志,使其在重启后永久存储(持久模式)或仅保留在内存中(易失模式)。
  • 结构化数据 (Structured Data): 日志包含 journalctl 用于过滤的元数据(如单元名称、优先级、启动 ID)。

基本查看命令

最常见需求是简单地查看日志。以下是开始探索系统历史的基础命令。

1. 查看所有日志

要查看系统开始记录日志以来收集到的所有条目,请在不带任何参数的情况下使用该命令:

journalctl

默认情况下,此输出使用类似 less 的工具进行分页,允许您使用箭头键或空格键上下导航。

2. 实时查看日志 (跟随)

类似于使用 tail -f,您可以监视日志写入日志(journal)的过程。这在启动或调试特定服务时非常宝贵:

journalctl -f

要退出实时视图,请按 Ctrl+C

3. 按行数限制输出

如果您只需要最近的条目,请使用 -n 标志来指定行数:

# 显示最后 20 条日志条目
journalctl -n 20

4. 自特定时间查看日志

按时间过滤是 journalctl 最强大的功能之一。您可以使用相对或绝对时间戳。

相对时间示例:

命令 描述
journalctl --since "1 hour ago" 最近一小时的日志。
journalctl --since "yesterday" 上一个日历日开始至今的日志。
journalctl --since "2023-10-26 14:30:00" 特定日期和时间之后的日志。

提示: 您可以组合使用 --since--until 来指定精确的范围,例如:journalctl --since "2023-10-26" --until "2023-10-27 00:00:00"


按单元、服务或进程过滤日志

journalctl 最关键的用途之一是隔离与特定 systemd 单元(服务)相关的消息。

按服务名称过滤

使用 -u(或 --unit)标志,后跟服务名称(例如 sshd.servicenginx.service):

# 仅查看 Apache 网络服务器服务的日志
journalctl -u apache2.service

# 跟随 Docker 服务的日志
journalctl -u docker.service -f

按启动 ID 过滤

Systemd 会跟踪不同系统启动期间的日志。要查看上一次启动的日志,请首先列出可用的启动项:

journalctl --list-boots

这会输出一个索引列表(例如,-1-2,当前启动为 0)。然后您可以使用索引或完整的启动 ID:

# 显示前一个启动的日志
journalctl -b -1

# 显示特定启动 ID 的日志(使用上面列出的长 ID)
journalctl -b a1b2c3d4e5f6...

过滤内核消息

仅查看源自内核的消息(类似于使用 dmesg):

journalctl -k
# 或者,等效地使用:
journalctl -b -k

高级过滤和输出控制

有效的故障排除通常需要组合使用过滤器并控制输出格式。

1. 按优先级级别过滤

日志被分配了优先级级别(0=emerg,7=debug)。您可以使用 -p(或 --priority)标志来查看处于或高于特定严重程度的消息:

优先级级别 数字值
err (错误) 3
warning (警告) 4
notice (通知) 5
info (信息) 6
# 显示 SSH 服务中的所有错误、关键和紧急消息
journalctl -u sshd.service -p err

2. 搜索特定文本

当标准过滤不够时,您可以将输出通过管道传输到 grep,尽管 journalctl 具有内置的文本搜索机制,对于结构化数据通常更高效:

# 搜索所有日志中包含单词 'failed' 的行
journalctl | grep failed

# 或者,使用 --grep 选项进行更简单的过滤(如果可用/首选)
journalctl --grep=failed

3. 更改输出格式

对于脚本编写或将日志移动到其他工具,更改输出格式至关重要。默认值是 pretty(人类可读)。

  • --output=json: 将条目输出为结构化的 JSON 对象。
  • --output=short: 类似于 pretty,但颜色较少。
  • --output=export: 输出原始日志条目以供存档。
# 以 JSON 格式输出最近的日志
journalctl -n 5 --output=json

4. 组合过滤器

过滤器是乘法堆叠的。要查看 Nginx 在过去 10 分钟内记录的所有错误:

journalctl -u nginx.service --since "10 minutes ago" -p err

管理日志大小和持久性

随着时间的推移,日志可能会占用大量磁盘空间,特别是如果配置为持久化日志记录时。系统管理员必须管理其大小。

检查当前使用情况

查看当前日志文件占用了多少磁盘空间:

journalctl --disk-usage

清理旧日志

您可以根据时间或总大小清除日志。

按时间清理:

# 只保留过去 7 天的日志
journalctl --vacuum-time=7d

按大小清理:

# 将总日志大小减少到最多 500 兆字节
journalctl --vacuum-size=500M

警告: 在删除日志时要小心,特别是来自较早启动(-b)的日志。确保不会过早删除关键的诊断信息。

结论

journalctl 是一个强大、灵活的工具,它将日志记录提升到了超越简单文本文件的水平。通过掌握基于时间的过滤(--since--until)、单元隔离(-u)和实时监控(-f),您可以获得对监控系统运行状况的细粒度控制。无论您是检查服务状态还是深入研究上周的内核崩溃,journalctl 都是您进入现代 Linux 系统日志的主要接口。