在互联网系统运维与开发中,"线上出 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 日志;
- 组合使用 > 单独使用。
把这些命令加入你的"线上急救包",下次线上告警响起时,你就能冷静应对,快速恢复服务!