线上排障利器:10 个必备 Linux 命令快速定位日志中的 Bug

在互联网系统运维与开发中,"线上出 Bug"是每个工程师都避不开的日常。面对用户反馈异常、服务响应变慢或接口报错,第一时间查看日志往往是定位问题的关键。而高效使用 Linux 命令行工具,能让你在海量日志中迅速抽丝剥茧,精准锁定故障根源。

本文整理了 10 个线上排查日志时最常用、最实用的 Linux 命令,助你从"大海捞针"变为"一击即中"。


1. tail ------ 实时追踪最新日志

查看日志文件末尾内容,常用于监控正在写入的日志:

bash 复制代码
# 查看最后 100 行
tail -n 100 /var/log/app.log

# 实时滚动输出(Ctrl+C 退出)
tail -f /var/log/app.log

# 跟随文件重命名(如 logrotate 后)
tail -F /var/log/app.log

适用场景:服务刚崩溃,想看最后几条记录;持续观察错误是否复现。


2. grep ------ 精准过滤关键词

从日志中搜索包含特定关键字的行:

perl 复制代码
# 搜索 "ERROR"
grep "ERROR" /var/log/app.log

# 忽略大小写
grep -i "exception" /var/log/app.log

# 显示匹配行前后各 3 行(上下文)
grep -C 3 "NullPointerException" /var/log/app.log

# 反向匹配(排除某内容)
grep -v "DEBUG" /var/log/app.log

适用场景:快速找出所有错误、异常堆栈或特定用户 ID 的请求。


3. less ------ 高效浏览大文件

cat 更适合查看大型日志文件(支持分页、搜索、跳转):

c 复制代码
less /var/log/app.log

常用快捷键

  • /keyword → 向下搜索
  • ?keyword → 向上搜索
  • n / N → 下一个 / 上一个匹配项
  • G → 跳到文件末尾
  • g → 跳到文件开头
  • q → 退出

适用场景:日志文件几百 MB 甚至 GB 级,需交互式浏览。


4. awk ------ 提取结构化字段

当日志为格式化文本(如 Nginx、JSON、空格/制表符分隔),可用 awk 提取关键列:

dart 复制代码
# 提取第 4 列(假设空格分隔)
awk '{print $4}' access.log

# 过滤状态码为 500 的请求 IP
awk '$9 == 500 {print $1}' access.log

# 统计各状态码出现次数
awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log

适用场景:分析访问日志、提取时间戳、用户 ID、错误码等结构化信息。


5. sed ------ 流式文本替换/删除

用于清洗日志或高亮关键信息(较少直接用于排查,但配合其他命令很强大):

c 复制代码
# 将所有 "WARN" 替换为 "[WARNING]"
sed 's/WARN/[WARNING]/g' app.log

# 删除空行
sed '/^$/d' app.log

6. wc ------ 统计行数、字数

快速了解日志规模或错误数量:

bash 复制代码
# 统计总行数
wc -l app.log

# 统计 ERROR 出现次数
grep -c "ERROR" app.log

适用场景:评估问题影响范围(如"今天有多少次超时?")。


7. sort + uniq ------ 去重与频次分析

组合使用可发现高频异常:

bash 复制代码
# 提取所有异常类名并统计出现次数
grep "Exception" app.log | awk '{print $3}' | sort | uniq -c | sort -nr

输出示例:

复制代码
42 java.lang.NullPointerException
15 com.example.ServiceUnavailableException

适用场景:识别最频繁的错误类型,优先修复。


8. journalctl ------ 查看 systemd 服务日志(现代 Linux)

若应用以 systemd 服务运行(如 myapp.service):

bash 复制代码
# 查看服务日志
journalctl -u myapp.service

# 实时跟踪
journalctl -u myapp.service -f

# 查看最近 1 小时日志
journalctl -u myapp.service --since "1 hour ago"

适用场景:容器外部署的 Java/Go 服务,使用 systemd 管理。


9. zgrep / zcat ------ 查询压缩日志

历史日志常被 gzip 压缩(如 app.log.1.gz),无需解压即可搜索:

bash 复制代码
# 直接搜索压缩日志
zgrep "Timeout" app.log.1.gz

# 查看压缩日志内容
zcat app.log.1.gz | head -20

适用场景:排查昨天或上周的问题,日志已被 logrotate 压缩。


10. lsof + ps ------ 辅助定位进程与文件关系

当不确定日志属于哪个进程时:

bash 复制代码
# 查看某日志文件被哪些进程打开
lsof /var/log/myapp.log

# 根据 PID 查进程详情
ps -p 12345 -f

适用场景:多实例部署,确认日志来源;排查文件句柄泄漏。


实战组合示例

问题:用户反馈"订单提交失败",需查找相关错误。

perl 复制代码
# 1. 实时监控日志
tail -f /var/log/order-service.log | grep "OrderSubmit"

# 2. 发现异常后,统计近 1 小时内该错误次数
grep "OrderSubmit failed" /var/log/order-service.log | wc -l

# 3. 提取失败用户的 ID 并去重
grep "OrderSubmit failed" /var/log/order-service.log | awk '{print $5}' | sort -u

总结

线上排障争分夺秒,熟练掌握这些 Linux 日志命令,能极大提升你的 Debug 效率。记住:

  • tail -f + grep 是黄金组合;
  • awk/sort/uniq 用于深度分析;
  • 不要忽略压缩日志和 systemd 日志
  • 组合使用 > 单独使用

把这些命令加入你的"线上急救包",下次线上告警响起时,你就能冷静应对,快速恢复服务!

相关推荐
Dilee15 小时前
Spring AI 2.0.0 接 Skill 最小 Demo:SkillsTool 加载 SKILL.md 一次跑通
后端
zoulee2415 小时前
doris-python:让 SQLAlchemy 玩转 Apache Doris 多驱动生态
后端
RainCity15 小时前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
Csvn16 小时前
Linux 系统性能监控与瓶颈排查
后端
铁皮饭盒16 小时前
Rust版Bun1.4之前, 盘点Bun1.3新特性
前端·javascript·后端
kfaino1 天前
码农的AI翻身(五)你好,我叫 Transformer
后端·aigc
Oneslide1 天前
机械革命 单系统纯净重装Ubuntu(全盘覆盖,清空原有Windows)
后端
GetcharZp1 天前
告别OOM!用Go+libvips实现30000×50000超大图片的流式瓦片服务
后端·go