tail -f app.log | grep "NullPointerException"
2023-11-15 14:30:01.339 ERROR - java.lang.NullPointerException: null
修改为下面的命令
tail -f error.log | grep -A 30 "NullPointerException\|TimeoutException"
屏幕输出瞬间改变,不再是孤立的单行错误,而是完整的异常堆栈、业务参数和调用链,开始实时滚动呈现。
“查历史压缩日志,可以跳过解压步骤。”我接着执行了第二条命令:
zgrep -A 30 -H "触发条件关键词" *.gz
单行陷阱:tail -f | grep 只能捕获异常片段,丢失关键堆栈信息
视觉疲劳:vi 逐行搜索消耗注意力,上下文关联困难
格式障碍:面对压缩日志文件时束手无策,额外解压步骤打断工作流
一、grep 组合拳:四类实战场景
1. 完整异常堆栈捕获技巧
实战要点:
-
-A N:显示匹配行后N行,覆盖典型堆栈深度 -
less分页器:支持/、?搜索、空格翻页、q退出 -
适用场景:事后分析、根因定位
2. 实时异常监控与上下文保留
# 生产环境实时告警模式
tail -f application.log | grep -Ai30 "ERROR\|Exception"
专业技巧:
-
-i:忽略大小写,覆盖不同日志规范 -
正则组合:使用
\|匹配多类异常关键词 -
Ctrl+C优雅终止,避免信号干扰
3. 压缩日志直接分析方案
# 跳过解压步骤,直击问题核心
zgrep -H -A50 "OutOfMemoryError" *.gz
参数解析:
-
-H:保留文件名,便于多文件溯源 -
原生支持
.gz格式,无需预处理 -
扩展应用:结合
zcat | grep处理特殊压缩格式
4. 异常趋势统计与模式发现
# 多文件异常频率分析
grep -c "ConnectionTimeout" *.log | sort -nr -t: -k2
进阶统计:
-
管道组合:
sort按数量降序排列 -
可视化准备:输出可直接导入监控系统
-
模式识别:通过频率变化发现系统瓶颈
5. 高级参数应用指南
上下文控制矩阵
参数组合:-B10 -A20
适用场景:错误前置条件分析
示例命令:grep -B10 -A20 "业务异常"
参数组合:-C15
适用场景:完整上下文审视
示例命令:grep -C15 "数据库死锁"
参数组合:-r -n
适用场景:跨文件定位
示例命令:grep -rn "内存泄漏" /var/log/
或者使用以下格式:
• 参数组合:-B10 -A20
适用场景:错误前置条件分析
示例命令:grep -B10 -A20 "业务异常"
• 参数组合:-C15
适用场景:完整上下文审视
示例命令:grep -C15 "数据库死锁"
• 参数组合:-r -n
适用场景:跨文件定位
示例命令:grep -rn "内存泄漏" /var/log/
反向工程技巧
# 排除干扰信息,聚焦核心问题
grep -v "健康检查\|心跳" app.log | grep -A30 "异常"
# 过滤已知噪音,提升信号纯度
二、生产环境实战进阶
多维度日志关联分析
# 时间窗口关联查询
grep -C10 "2023-11-15 14:30" app.log | grep -A20 "事务回滚"
# 分布式追踪集成grep -A40 "traceId:0a1b2c3d" service*.log
性能敏感场景优化
# 大文件处理加速方案
grep -m1000 "ERROR" large.log # 限制输出数量
grep --binary-files=text "异常" binary.log # 二进制文件安全处理
正则表达式性能调优
# 高效模式匹配
grep -E "Timeout\|Reject\|Failure" # 扩展正则,逻辑清晰
fgrep -f patterns.txt app.log # 固定字符串匹配,性能最优
三、扩展你的工具链
第一梯队:单机即时分析
wc:行数统计利器
# 统计错误出现的总次数
grep "ERROR" app.log | wc -l
# 统计唯一异常类型数量
grep "Exception" app.log | awk -F':' '{print $4}' | sort | uniq | wc -l
awk:字段处理与数据提炼
# 提取特定字段(如第7列状态码为500的日志行)
awk '$7 == 500' app.log
# 统计接口平均响应时间
awk '{sum+=$9; count++} END {print "平均响应时间:", sum/count, "ms"}' app.log
# 统计每个URL的访问次数
awk '{print $5}' access.log | sort | uniq -c | sort -nr
sed:流式文本编辑与清洗
# 提取今天14:00到14:10的日志
sed -n '/2023-11-15 14:00:00/,/2023-11-15 14:10:00/p' app.log
# 清理日志中的敏感信息(如手机号)
sed 's/\([0-9]\{3\}\)[0-9]\{4\}\([0-9]\{4\}\)/\1****\2/g' app.log
第二梯队:组合技发挥最大威力
场景:统计每分钟超时错误的数量
grep "Timeout" application.log | \
sed -n 's/.*\(2023-11-15 14:[0-9][0-9]\).*/\1/p' | \
sort | \
uniq -c
场景:分析Nginx日志,找出返回码非200的请求IP
awk '$9 != 200 {print $1}' access.log | sort | uniq -c | sort -nr | head -20