第 60 课:journalctl 日志查看
所属模块: 进程管理 难度: intermediate 标签: journalctl, logging 上一课: 编写 systemd Unit 文件 下一课: 网络接口配置 ip/ifconfig
1. 学习目标
通过本节课的学习,你将能够:
- 理解
journalctl的基本概念及其与传统日志系统(如 syslog)的区别。 - 使用
journalctl命令的基本语法查看和浏览系统日志。 - 掌握强大的过滤功能,按时间、服务单元、优先级等多种条件筛选日志。
- 学习如何定制日志的输出格式,并处理二进制格式的日志。
- 利用
journalctl进行高效的故障排查和系统监控。
2. 核心概念
在现代 Linux 系统(使用 systemd 的发行版,如 Ubuntu 16.04+、CentOS 7+)中,日志管理系统也发生了变革。systemd-journald 服务取代了传统的 syslogd,成为核心的日志守护进程。
journalctl 是 systemd-journald 的命令行前端,用于查询和显示由服务内核、用户空间进程和各种服务(由 systemd 管理)生成的日志。
与传统日志(如 /var/log/syslog 或 /var/log/messages)的区别:
- 集中存储: 日志存储在一个二进制数据库(通常在
/var/log/journal/)中,而非多个纯文本文件。这带来了更高效、更结构化的查询。 - 结构化日志: 每条日志都附带丰富的元数据(如时间戳、进程ID、服务名、优先级),查询时无需依赖文本搜索。
- 实时跟踪: 可以轻松地实时跟踪(
-f)特定服务或整个系统的日志输出。 - 统一管理: 内核日志(
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. 常见错误
- 权限不足: 许多日志需要
root权限才能查看(特别是其他用户的服务或内核日志)。如果看到-- No entries --但确定应该有日志,请尝试使用sudo journalctl ...。 - 混淆
-u和-t:-u用于 Unit(服务单元)名称,如sshd.service。-t用于 syslog 标识符(IDENTIFIER),如kernel,sshd(注意没有.service后缀)。两者查询范围不同。 - 忽略
--no-pager: 默认情况下,journalctl会将输出通过less分页。在脚本中或进行管道操作时,可能需要使用--no-pager或-l来避免分页,获得原始输出。 - 二进制日志无法直接查看: 存储在
/var/log/journal/下的.journal文件是二进制的,不能用cat或vim查看。必须且只能通过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 服务自身,例如设置日志的持久化存储和空间限制。