第 10 章 · 日志查看与 journalctl
本章目标:分清 systemd 日志(journalctl) 与 应用文本日志(文件 + grep);会按服务名、时间、级别过滤;走完 api-go-demo 一次完整排障五步法;理解日志级别与 JSON 结构化日志。
学时建议:4~5 小时(含 2.5 小时跟练)
前置:完成 linux-shell ch05(systemd)、ch04(grep)、ch09(磁盘)。
10.1 场景说明:status 是绿的,用户说还是 500
测试环境 api-go-demo:
systemctl status api-go-demo→ active (running)curl healthz→ 超时或 500- 运营贴了一条
request_id=req-1003的报错
老手不会先重启,而是问:日志在哪、写什么级别、能不能按 request_id 搜。
Linux 上常见两条线:
① systemd / journalctl → 服务启停、panic、标准输出/err
② 应用文件日志 → /var/log/... 或 ~/dev-workspace/logs/api.log
ch04 已在文件里 grep;本章补上 journalctl,并把它们串成一套流程。
10.2 学完你能
| 能力 | 验收 |
|---|---|
| 两类日志 | 说清何时用 journalctl、何时 grep 文件 |
| journalctl | -u、-f、--since、-p err、-b |
| 业务日志 | tail -f + grep ERROR(ch04 复习) |
| 级别 | DEBUG/INFO/WARN/ERROR 生产怎么用 |
| 五步法 | status → journal → app log → request_id → 修复提交 |
| 磁盘 | 日志暴涨先 df(ch09) |
10.3 两类日志对照(先建立地图)
| 类型 | 谁写的 | 你怎么读 | 典型内容 |
|---|---|---|---|
| journal(systemd) | 受 systemd 托管的服务 stdout/stderr | journalctl -u 服务名 | 启动失败、panic、未配置 file 时的 print |
| syslog 文本 | rsyslog 等 | /var/log/syslog、grep | 系统综合消息 |
| 应用日志文件 | 程序自己写文件 | tail/grep ch04 | access、ERROR、request_id、slug |
ch05 的 shop-demo-heartbeat 若 ExecStart 是脚本 echo,输出就在 journal 里。
api-go-demo 生产常见:文件 /var/log/api-go-demo/app.log + 崩溃信息在 journal。
10.4 跟练:journalctl 基础
步骤 1 — 最近 30 条系统日志
journalctl --no-pager -n 30
你应该看到:每行前有时间戳、主机名、进程/unit 名,后面是消息。
读懂一行(形态示例):
Aug 20 10:01:02 hostname sshd[1234]: Accepted publickey for ubuntu...
步骤 2 — 只看 ssh 服务(ch05/ch08 相关)
journalctl -u ssh --no-pager -n 15
-u = unit 名,与 systemctl status ssh 里的名字一致(有时叫 ssh.service)。
步骤 3 — 实时跟踪(类似 tail -f)
journalctl -u ssh -f
另开终端 SSH 登录一次,应看到新行滚动。Ctrl+C 退出 -f。
步骤 4 — 时间范围
journalctl --since "1 hour ago" --no-pager | tail -20
journalctl --since today --no-pager | wc -l
步骤 5 — 只看错误级别及以上
journalctl -p err --since today --no-pager | head -20
优先级:emerg alert crit err warning notice info debug;-p err 含 err 及更严级别。
步骤 6 — 本次开机以来
journalctl -b --no-pager -n 10
为什么 服务器刚重启后出问题:-b 排除上一轮 boot 的旧噪音。
10.5 journalctl 选项速查(贴笔记)
| 选项 | 作用 | 示例场景 |
|---|---|---|
-u UNIT | 指定服务 | api-go-demo、nginx |
-f | 跟踪新日志 | 复现 bug 时盯着 |
--since / --until | 时间窗 | 「出问题那 10 分钟」 |
-p err | 优先级过滤 | 告警巡检 |
-b | 当前启动 | 重启后排查 |
--no-pager | 直接输出 | 脚本里用 |
-n 50 | 最后 N 行 | 快速浏览 |
10.6 跟练:ch05 heartbeat 的 journal
若 ch05 仍启用 shop-demo-heartbeat:
systemctl status shop-demo-heartbeat
journalctl -u shop-demo-heartbeat -n 10 --no-pager
journalctl -u shop-demo-heartbeat -f
你应该看到:shop-demo heartbeat ok 周期性出现。
若 unit 不存在:用 ssh 练 10.4 即可。
10.7 跟练:应用文本日志(复习 ch04)
步骤 1 — 确认 api.log 存在
ls -lh ~/dev-workspace/logs/api.log
wc -l ~/dev-workspace/logs/api.log