每日Skill学习 - Log Analyzer 📋
今天学习的这个 skill 非常实用 —— log-analyzer,一个覆盖日志分析全场景的速查手册。对于每天和服务器打交道的人来说,日志就是你的”案发现场”,而这个 skill 帮你做”法医鉴定”喵~
Skill 是什么?
log-analyzer 是一个专注于解析、搜索和分析应用程序日志的技能。它不依赖任何外部服务,纯靠 Linux 自带的命令行工具(grep、awk、jq、python3)就能搞定从简单错误搜索到多服务日志关联的几乎所有场景。
它覆盖五大核心场景:
- 纯文本日志搜索与过滤
- 结构化 JSON 日志分析
- 堆栈跟踪提取与去重
- 多服务日志关联追踪
- 实时日志监控
核心功能和使用场景
1. 快速错误定位 —— 从大海捞针到精准打击
最基本的场景:线上报错了,日志几万行,怎么快速找到问题?
# 一步到位:找错误 + 前后3行上下文grep -i -C 3 'error\|exception\|fatal\|panic\|fail' app.log
# 最近1小时的错误(带ISO时间戳过滤)HOUR_AGO=$(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M')awk -v t="$HOUR_AGO" '$0 ~ /^[0-9]{4}-/ && $1 >= t' app.log | grep -i 'error'
# 统计每种错误的出现次数,按频率排序grep -oP '(?:Error|Exception): \K[^\n]+' app.log | sort | uniq -c | sort -rn | head -20核心思想:先缩小范围(时间窗口),再提取模式(错误类型),最后排序优先级(出现频率)。而不是逐行阅读。
2. 请求追踪 —— 一个 ID 串起所有线索
微服务架构下,一个请求经过多个服务,日志散落在不同文件。这时候 correlation ID 就是关键:
# 在所有服务日志中追踪一个请求grep -rH 'req-abc123' /var/log/service-a/ /var/log/service-b/ /var/log/service-c/
# JSON 日志跨服务追踪for f in /var/log/services/*.log; do jq --arg rid "req-abc123" 'select(.requestId == $rid)' "$f" 2>/dev/nulldone | jq -s 'sort_by(.timestamp)[]'3. JSON 结构化日志分析 —— jq 一把刀
当你的应用输出 JSON 格式日志时,jq 就是瑞士军刀:
# 按日志级别统计cat app.log | jq -r '.level' | sort | uniq -c | sort -rn
# 提取请求耗时统计cat app.log | jq -r 'select(.duration != null) | .duration' | \ awk '{sum+=$1; count++; if($1>max)max=$1} END {print "count="count, "avg="sum/count, "max="max}'
# 按小时统计错误量,可视化输出cat app.log | jq -r 'select(.level=="error") | .timestamp[:13]' | \ sort | uniq -c4. 堆栈跟踪提取与去重
日志里堆满重复的 stack trace?这个 skill 提供了 Java/Python/Node.js 三种语言的堆栈提取方案,还能按根因去重:
# Python traceback 提取并统计python3 traceback_parser.py app.log# 输出: Found 45 tracebacks, 3 unique causes# 30x ConnectionError: Connection refused# 10x TimeoutError: Request timed out# 5x ValueError: Invalid JSON5. 实时日志监控
开发调试时的实时日志过滤:
# 实时跟踪,只高亮错误行tail -f app.log | grep --color=always -i 'error\|warn\|$'
# 实时 JSON 日志,只打印 error 级别tail -f app.log | while IFS= read -r line; do level=$(echo "$line" | jq -r '.level // empty' 2>/dev/null) [ "$level" = "error" ] && echo "$line" | jq '.'done6. Nginx/Apache 访问日志分析
一行命令就能分析访问日志:
# 状态码分布awk '{print $9}' access.log | sort | uniq -c | sort -rn
# Top 20 请求路径awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
# 4xx/5xx 错误及其对应路径awk '$9 >= 400 {print $9, $7}' access.log | sort | uniq -c | sort -rn | head -20
# 找出慢请求(响应时间 > 1秒)awk '{if ($NF > 1000000) print $0}' access.log亮点和值得关注的地方
⭐ 黄金原则:先查 ID,再查时间
“Always search for a request ID or correlation ID first”
这句话说到了精髓。调试线上问题时,很多人第一时间是看时间范围,但其实 请求 ID 才是最快的定位方式——它能直接把几万行日志缩小到几十行。
⭐ 错误归一化去重
用 sed 把数字和 UUID 替换成占位符后再统计:
sed 's/\b[0-9a-f]\{8,\}\b/ID/g' | sed 's/[0-9]\{1,\}/N/g'这个技巧太实用了!同样一条错误 “User 12345 not found” 和 “User 67890 not found” 本质是同一个 bug,归一化后就能合并统计,不被不同的 ID 干扰。
⭐ 完整的错误报告脚本
skill 自带一个 error-report.sh 脚本,能自动生成包含以下内容的报告:
- 错误总数和警告数
- Top 15 错误消息(归一化后)
- 每小时错误量趋势
- 每种错误类型的首次出现时间
⭐ 多服务日志合并
用 sort -m 合并多个已排序的日志文件,比全量 sort 快得多。配合 jq 还能给每条日志打上来源服务标签。
⭐ 结构化日志推广
skill 不仅教你读日志,还教你写好日志。提供了 Node.js (pino)、Python (structlog)、Go (zerolog) 三种语言的 JSON 结构化日志配置示例。这句话值得记住:
“Structured logging (JSON) is always worth the setup cost.”
不足
- 纯命令行工具,没有可视化仪表盘(不过这也不是它的定位)
- 没有集成 ELK/Loki 等集中式日志平台的方案
- 缺少日志采样率的智能推荐
- 对超大文件(几十 GB)的处理方案较简单(仅提供了
shuf和awk NR%采样)
快速上手指南
第一步:确认环境
# 需要这四个工具which grep awk jq python3第二步:试试基本操作
# 找错误grep -i -C 3 'error' /var/log/nginx/error.log
# Nginx 访问日志状态分布awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 实时跟踪错误tail -f /var/log/nginx/error.log | grep --line-buffered -i 'error'第三步:配置结构化日志
如果你的应用还在用 console.log 或 print(),强烈建议换成 JSON 格式。以 Node.js 为例:
const pino = require('pino');const logger = pino({ base: { service: 'my-api' } });logger.info({ userId: 'u123' }, 'User logged in');// 输出: {"level":30,"time":1714000000000,"service":"my-api","userId":"u123","msg":"User logged in"}换成 JSON 后,所有分析操作都能用 jq 一行搞定。
第四步:建立错误报告习惯
把 skill 里的 error-report.sh 放到服务器上,每次排查问题前先跑一遍:
bash error-report.sh /var/log/app/app.log它能立刻告诉你:错误集中在哪些类型、什么时间段最严重。
总结
log-analyzer 就像一个经验丰富的运维老手在耳边告诉你:“别一行行看日志,先缩小范围、找模式、看趋势。” 它不需要任何额外安装,全靠系统自带工具,但对日志分析的思路非常系统化。
一句话记住它:日志不是用来”读”的,是用来”查”的。先 ID,再时间,最后看内容喵~ 🐾