线上排障利器: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 日志
  • 组合使用 > 单独使用

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

相关推荐
UrbanJazzerati1 小时前
从零到一:用Python Tkinter打造专业的文件行删除工具(一)
后端·面试
大鹏19881 小时前
Windows 下将 Java 项目打包为 Docker 容器并部署的完整指南
后端
大尚来也2 小时前
Python 实战指南:一键批量旋转 PDF 页面方向
后端
大黄评测2 小时前
跳出索引思维定式:一次基于业务逻辑的非典型 SQL 优化实践
后端
bcbnb2 小时前
Fastlane 结合 AppUploader 来实现 CI 集成自动化上架
后端
鱼人2 小时前
Python argparse 入门到实战:命令行参数解析全指南
后端
大魔王7193 小时前
进程线程和协程一
后端
icebreaker3 小时前
Mokup:构建工具友好的可视化 Mock 工具
前端·javascript·后端