线上日志排查问题

1、查异常堆栈

显示该行及其后面的50行内容,然后通过 less 命令进行分页查看

bash 复制代码
grep -A 50 "NullPointerException" a.log | less

参数解释:

  • grep: 文本搜索命令
  • -A 50: After 的意思,显示匹配行后面的50行
  • "NullPointerException": 要搜索的文本模式(Java空指针异常)
  • a.log: 目标日志文件
  • |: 管道符,将前一个命令的输出传递给后一个命令
  • less: 分页查看器,用于逐页浏览长文本

A的参数还可以替换为以下参数:

  • -B 50:Before的意思,显示匹配行前面的50行
  • -C 50:Context的意思,显示匹配行前后的50行(对称显示)

2、实时监控新日志

实时监控日志文件,当出现 "NullPointerException" 时,显示该异常及其后面的50行内容。

bash 复制代码
tail -f a.log | grep --line-buffered "NullPointerException"

参数解释:

  • tail -f: 实时跟踪文件的新增内容
  • a.log: 目标日志文件
  • --line-buffered:仅显示匹配的行

3、翻历史/压缩日志

快速定位多个日志文件中的空指针异常,并查看完整的错误堆栈信

bash 复制代码
grep -H -A 50 "NullPointerException" *.log

参数解释:

  • -H: 显示文件名(即使只搜索一个文件)
  • *.log: 匹配所有以 .log 结尾的文件
bash 复制代码
zgrep -H -A 50 "NullPointerException" *.gz

参数解释:

  • zgrep: 专门用于搜索压缩文件的grep命令
  • *.gz: 匹配所有以 .gz 结尾的压缩文件

4、统计异常数量

统计每个 .log 文件中包含 "NullPointerEWxception" 的行数

bash 复制代码
grep -c "NullPointerEWxception" *.log

-c: count 的意思,统计匹配行的数量

5、多种异常一起查

使用正则表达式在日志文件中同时搜索两种异常。

bash 复制代码
grep -E "NullPointerException|TimeoutException|IOException|SQLException" a.log

参数解释:

  • -E: 使用扩展正则表达式(Extended Regular Expressions),启用扩展正则表达式,使得 | 被解释为或操作符,而不是普通字符
  • "NullPointerException|TimeoutException|IOException|SQLException": 匹配包含 "NullPointerException" 或者 "TimeoutException" 或者"IOException"或者"SQLException"的行

6、反向过滤(排除无关)

查找空指针异常并过滤掉调试信息

bash 复制代码
grep "NullPointerException" a.log -A 20 | grep -v "debug"

参数解释:

  • grep -v:反向匹配,显示不包含指定模式的行

7、按时间范围筛选日志

查询出2025-08-21 10点到11点之间出现的空指针异常

bash 复制代码
awk '/2025-08-21 10:/,/2025-08-21 12:/' a.log | grep "NullPointerException"

参数解释:

  • awk: 文本处理工具
  • /2025-08-21 10:/,/2025-08-21 12:/:范围模式(提取这两个时间点之间的所有行)
    • 起始模式:包含 "2025-08-21 10:" 的行
    • 结束模式:包含 "2025-08-21 12:" 的行

8、关键字AND查询

查找同时包含 "Exception" 和 "UserService" 的行

bash 复制代码
grep "Exception" a.log | grep "UserService"

9、定位最近一次异常

从日志文件的末尾开始搜索,找到最后一个 "NullPointerException" 并显示它及其后面的50行内容

bash 复制代码
tac a.log | grep -m 1 "NullPointerException" -A 50

参数说明:

  • tac: 反向显示文件内容(cat的反向命令),从文件的最后一行开始,逐行向上显示,相当于把文件内容完全颠倒顺序
  • |:管道,将反向排列的日志内容传递给 grep
  • -m 1: 最多匹配1次,找到第一个匹配就停止

10、异常排行

用于统计日志中各种异常的出现次数并按频率排序

bash 复制代码
grep "Exception" a.log | sort | uniq -c | sort -nr | head

参数说明:

  • grep "Exception" a.log:从 a.log 中筛选出包含 "Exception" 的所有行
  • sort:对异常行进行排序(按字母顺序)
  • uniq -c:合并相同的异常行并显示计数
  • sort -nr:按出现次数从高到低排序
    • n: 按数字排序
    • r: 反向排序(降序)
  • head:显示前10行(默认)