Linux 面试题:日志排查常用命令组合与 journalctl 高级用法

日志排查是 Linux 运维和开发岗位面试中的高频考点,面试官通常不会只问你“怎么查看日志”,而是会通过具体场景考察你对命令组合的掌握程度,以及对 systemd 日志体系的理解深度。本文从实战角度出发,梳理常见的命令组合和 journalctl 的高级用法,帮助你从容应对这类面试题。

一、基础命令组合:从“找日志”到“定位问题”

1. 实时追踪 + 关键字过滤

面试中最常见的场景是:线上服务报错,需要实时观察日志中是否出现异常关键字。

tail -f /var/log/nginx/error.log | grep --line-buffered "502"

这里的关键点是 --line-buffered。如果不加这个参数,grep 会使用块缓冲,导致管道中的输出不能实时显示,在面试中能主动提到这一点,说明你有实际排查经验。

2. 时间范围 + 上下文

定位到某条错误后,通常需要查看该错误前后的日志来还原现场。

grep -n "OutOfMemoryError" app.log | head -5
# 假设定位到第 1823 行
sed -n '1800,1850p' app.log

或者用 grep 的上下文参数一步到位:

grep -B 10 -A 20 "OutOfMemoryError" app.log

-B 表示 before,-A 表示 after,-C 则是前后各若干行。面试时可以根据场景灵活选择。

3. 多条件组合过滤

实际排查中往往需要同时满足多个条件,比如“某个时间段内、某个接口、返回 500 的请求”。

awk '$4 >= "[10/Jan/2025:14:00:00" && $4 <= "[10/Jan/2025:14:05:00"' access.log \
  | grep "/api/order" \
  | grep " 500 " \
  | wc -l

这条命令组合了时间范围筛选、接口路径过滤、状态码过滤和计数,是面试中展示综合能力的典型例子。

4. 统计与排序:快速发现异常模式

当日志量很大时,直接看内容效率很低,先做聚合统计往往能更快定位问题。

# 统计访问量最高的前 10 个 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

# 统计各状态码出现次数
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 按分钟统计错误数量,观察错误是否集中在某个时间点
grep "ERROR" app.log | awk '{print $1, $2}' | cut -d: -f1,2 | uniq -c

这类“统计先行”的思路在面试中很加分,因为它体现的是排查方法论,而不只是命令记忆。

二、journalctl 高级用法

systemd 体系下,journalctl 是查看日志的核心工具。很多面试者只会 journalctl -u service,但实际工作中还有大量高级用法值得掌握。

1. 按时间窗口精确过滤

# 查看今天上午 9 点到 10 点之间的日志
journalctl --since "2025-01-10 09:00:00" --until "2025-01-10 10:00:00"

# 相对时间写法
journalctl --since "1 hour ago"
journalctl --since "yesterday" --until "today"

时间过滤是 journalctl 相比传统文本日志的一大优势,不需要手动解析时间戳。

2. 按优先级过滤

# 只看 error 及以上级别
journalctl -p err -b

# 查看 warning 到 critical 级别
journalctl -p warning..critical

优先级从低到高为:emerg(0)、alert(1)、crit(2)、err(3)、warning(4)、notice(5)、info(6)、debug(7)。-p err 等价于 -p 0..3,面试中能说清这个对应关系会让人印象深刻。

3. 按字段精确过滤

journalctl 支持按结构化字段过滤,这是它区别于文本日志的关键能力。

# 按进程 PID 过滤
journalctl _PID=12345

# 按可执行文件路径过滤
journalctl /usr/sbin/sshd

# 按 systemd unit 过滤
journalctl _SYSTEMD_UNIT=nginx.service

# 组合多个字段
journalctl _SYSTEMD_UNIT=nginx.service _PID=1234

可以用 journalctl -o verbose 查看一条日志的全部字段,了解有哪些可过滤的维度。

4. 输出格式控制

# JSON 格式,便于程序处理
journalctl -u nginx -o json-pretty

# 短格式,只显示关键信息
journalctl -u nginx -o short

# 显示解释后的字段名
journalctl -u nginx -o verbose

在需要将日志导入 ELK 或其他分析系统时,-o json 非常实用。

5. 磁盘占用管理与持久化

# 查看日志占用的磁盘空间
journalctl --disk-usage

# 清理日志,保留最近 500M
journalctl --vacuum-size=500M

# 清理日志,只保留最近 7 天
journalctl --vacuum-time=7d

默认情况下,journal 日志存放在 /run/log/journal,重启后丢失。要持久化需要创建 /var/log/journal 目录并重启 systemd-journald:

mkdir -p /var/log/journal
systemctl restart systemd-journald

这个知识点在面试中经常被追问,因为很多生产环境需要保留历史日志用于事后分析。

6. 跨启动查看与启动列表

# 查看所有启动记录
journalctl --list-boots

# 查看上一次启动的日志
journalctl -b -1

# 查看所有启动的日志(不限制当前启动)
journalctl --merge

当服务器重启后需要排查重启前的问题时,-b -1 是必备技能。

三、面试中的常见追问

追问一:grep 和 journalctl 过滤有什么区别?

grep 是对文本做模式匹配,适合非结构化日志;journalctl 基于结构化字段过滤,精度更高,且支持时间范围和优先级过滤,不需要手动解析时间戳。两者可以结合使用,比如 journalctl -u nginx --since "1 hour ago" | grep "502"

追问二:日志量太大,tail -f 刷屏怎么办?

可以结合 grep 过滤、使用 less +F 进入跟随模式后随时暂停搜索、或者用 journalctl -f -p err 只关注错误级别。

追问三:如何排查一个已经退出的服务的问题?

如果服务已经退出,systemctl status 可能只显示最后几行。此时应该用 journalctl -u service-name --since "10 min ago" 查看完整日志,必要时用 -b -1 查看上一次启动的记录。

四、总结

日志排查类面试题的核心不是考你记住多少命令,而是考察三件事:是否知道去哪里找日志(文件路径 vs journal)、是否能用组合命令缩小范围(时间、关键字、字段、优先级)、是否有结构化的排查思路(先统计后定位,先范围后细节)。把本文中的命令组合和 journalctl 用法理解透,配合实际场景练习,就能在面试中展现出扎实的实战能力。

未经允许不得转载:任鹏个人博客 » Linux 面试题:日志排查常用命令组合与 journalctl 高级用法

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏