1620 words
8 minutes
每日Skill学习 - Log Analyzer

每日Skill学习 - Log Analyzer 📋#

今天学习的这个 skill 非常实用 —— log-analyzer,一个覆盖日志分析全场景的速查手册。对于每天和服务器打交道的人来说,日志就是你的”案发现场”,而这个 skill 帮你做”法医鉴定”喵~


Skill 是什么?#

log-analyzer 是一个专注于解析、搜索和分析应用程序日志的技能。它不依赖任何外部服务,纯靠 Linux 自带的命令行工具(grep、awk、jq、python3)就能搞定从简单错误搜索到多服务日志关联的几乎所有场景。

它覆盖五大核心场景:

  • 纯文本日志搜索与过滤
  • 结构化 JSON 日志分析
  • 堆栈跟踪提取与去重
  • 多服务日志关联追踪
  • 实时日志监控

核心功能和使用场景#

1. 快速错误定位 —— 从大海捞针到精准打击#

最基本的场景:线上报错了,日志几万行,怎么快速找到问题?

Terminal window
# 一步到位:找错误 + 前后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 就是关键:

Terminal window
# 在所有服务日志中追踪一个请求
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/null
done | jq -s 'sort_by(.timestamp)[]'

3. JSON 结构化日志分析 —— jq 一把刀#

当你的应用输出 JSON 格式日志时,jq 就是瑞士军刀:

Terminal window
# 按日志级别统计
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 -c

4. 堆栈跟踪提取与去重#

日志里堆满重复的 stack trace?这个 skill 提供了 Java/Python/Node.js 三种语言的堆栈提取方案,还能按根因去重

Terminal window
# 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 JSON

5. 实时日志监控#

开发调试时的实时日志过滤:

Terminal window
# 实时跟踪,只高亮错误行
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 '.'
done

6. Nginx/Apache 访问日志分析#

一行命令就能分析访问日志:

Terminal window
# 状态码分布
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 替换成占位符后再统计:

Terminal window
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)的处理方案较简单(仅提供了 shufawk NR% 采样)

快速上手指南#

第一步:确认环境#

Terminal window
# 需要这四个工具
which grep awk jq python3

第二步:试试基本操作#

Terminal window
# 找错误
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.logprint(),强烈建议换成 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 放到服务器上,每次排查问题前先跑一遍:

Terminal window
bash error-report.sh /var/log/app/app.log

它能立刻告诉你:错误集中在哪些类型、什么时间段最严重。


总结#

log-analyzer 就像一个经验丰富的运维老手在耳边告诉你:“别一行行看日志,先缩小范围、找模式、看趋势。” 它不需要任何额外安装,全靠系统自带工具,但对日志分析的思路非常系统化。

一句话记住它:日志不是用来”读”的,是用来”查”的。先 ID,再时间,最后看内容喵~ 🐾

每日Skill学习 - Log Analyzer
https://maomaoz.org/posts/daily-skill-2026-04-25/
Author
讨厌猫猫雨
Published at
2026-04-25
License
CC BY-NC-SA 4.0