60·进程管理进阶

journalctl 日志查看

journalctllogging

第 60 课:journalctl 日志查看

所属模块: 进程管理 难度: intermediate 标签: journalctl, logging 上一课: 编写 systemd Unit 文件 下一课: 网络接口配置 ip/ifconfig


1. 学习目标

通过本节课的学习,你将能够:

  1. 理解 journalctl 的基本概念及其与传统日志系统(如 syslog)的区别。
  2. 使用 journalctl 命令的基本语法查看和浏览系统日志。
  3. 掌握强大的过滤功能,按时间、服务单元、优先级等多种条件筛选日志。
  4. 学习如何定制日志的输出格式,并处理二进制格式的日志。
  5. 利用 journalctl 进行高效的故障排查和系统监控。

2. 核心概念

在现代 Linux 系统(使用 systemd 的发行版,如 Ubuntu 16.04+、CentOS 7+)中,日志管理系统也发生了变革。systemd-journald 服务取代了传统的 syslogd,成为核心的日志守护进程

journalctlsystemd-journald 的命令行前端,用于查询和显示由服务内核、用户空间进程和各种服务(由 systemd 管理)生成的日志。

与传统日志(如 /var/log/syslog/var/log/messages)的区别:

  1. 集中存储: 日志存储在一个二进制数据库(通常在 /var/log/journal/)中,而非多个纯文本文件。这带来了更高效、更结构化的查询。
  2. 结构化日志: 每条日志都附带丰富的元数据(如时间戳、进程ID、服务名、优先级),查询时无需依赖文本搜索。
  3. 实时跟踪: 可以轻松地实时跟踪(-f)特定服务或整个系统的日志输出。
  4. 统一管理: 内核日志(dmesg)、启动日志、服务日志都可以通过 journalctl 一个命令访问。

3. 代码示例

示例 1:基础用法

# 查看所有日志(从最旧到最新,可能很长,用空格翻页,q退出)
journalctl

# 反向查看,从最新日志开始
journalctl -r

# 只显示最后 20 行日志
journalctl -n 20

示例 2:按服务单元(Unit)过滤

# 查看 Nginx Web 服务器的日志
journalctl -u nginx.service

# 同时查看 Nginx 和 SSH 服务的日志
journalctl -u nginx.service -u sshd.service

# 实时跟踪 SSH 服务的日志(非常实用的调试工具)
journalctl -u sshd.service -f

示例 3:按时间过滤

# 查看今天的日志
journalctl --since "today"

# 查看从昨天 23:00 到今天 10:00 的日志
journalctl --since "yesterday 23:00" --until "10:00"

# 查看最近 1 小时的日志
journalctl --since "1 hour ago"

# 查看特定时间范围的日志
journalctl --since "2024-03-20 14:00:00" --until "2024-03-20 15:30:00"

示例 4:按优先级(级别)过滤

日志级别从低到高:emerg, alert, crit, err, warning, notice, info, debug

# 只显示错误及以上级别(err, crit, alert, emerg)的日志
journalctl -p err

# 只显示警告和错误级别
journalctl -p warning..err

示例 5:输出控制与格式

# 显示内核日志(类似 dmesg)
journalctl -k
# 或
journalctl -t kernel

# 查看本次启动的日志
journalctl -b
# 查看上一次启动的日志(-1),再上一次(-2),以此类推
journalctl -b -1

# 以 JSON 格式输出,便于其他程序解析
journalctl -u sshd.service -o json-pretty

# 显示完整的长日志条目,不截断输出
journalctl -u nginx.service -l --no-pager

4. 实践练习

练习 1:基础日志浏览 查看你系统上 cron.service 的最后 10 条日志记录。

  • 要求: 使用一条命令完成。
  • 预期输出: 显示 cron.service 相关的最新 10 行日志内容。

练习 2:复合条件过滤 找出昨天发生的所有错误级别(err) 的日志,这些日志不是来自内核

  • 要求: 组合使用时间、优先级和内核过滤参数。
  • 预期输出: 列出所有符合条件的非内核错误日志。

练习 3:故障排查 你的 nginx.service 似乎无法启动。请使用 journalctl 查看它从上次系统启动至今(本次启动) 的所有日志,并特别关注是否有错误信息。

  • 要求: 使用 -b(本次启动)和 -u(指定服务)参数,并确保错误信息不被截断(使用 -l--no-pager)。
  • 预期输出: 显示 nginx.service 在本次启动期间的完整日志,其中应能清晰看到启动失败的原因(如配置文件错误、端口占用等)。

5. 常见错误

  1. 权限不足: 许多日志需要 root 权限才能查看(特别是其他用户的服务或内核日志)。如果看到 -- No entries -- 但确定应该有日志,请尝试使用 sudo journalctl ...
  2. 混淆 -u-t -u 用于 Unit(服务单元)名称,如 sshd.service-t 用于 syslog 标识符(IDENTIFIER),如 kernel, sshd(注意没有 .service 后缀)。两者查询范围不同。
  3. 忽略 --no-pager 默认情况下,journalctl 会将输出通过 less 分页。在脚本中或进行管道操作时,可能需要使用 --no-pager-l 来避免分页,获得原始输出。
  4. 二进制日志无法直接查看: 存储在 /var/log/journal/ 下的 .journal 文件是二进制的,不能用 catvim 查看。必须且只能通过 journalctl 命令来访问。

6. 小结

本节课我们深入学习了 systemd 时代的日志管理利器 journalctl

  • 核心优势:集中、结构化、实时、功能强大。
  • 基本查看journalctl-r(反向)、-n(行数)。
  • 核心过滤
    • 按服务:-u <unit_name>
    • 按时间:--since--until
    • 按优先级:-p <level>
    • 按启动次数:-b
    • 仅内核:-k-t kernel
  • 输出控制-f(实时跟踪)、-o json-pretty(JSON格式)、-l(不截断)。

掌握 journalctl 能让你从海量系统信息中迅速定位问题,是 Linux 系统管理和故障排查的必备技能。在后续的课程中,我们将继续学习如何配置 journald 服务自身,例如设置日志的持久化存储和空间限制。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「网络接口配置 ip/ifconfig」 以巩固所学知识。