每日Skill学习 - log-analyzer
Skill 是什么
log-analyzer 是一个命令行驱动的日志分析技能,专门用来处理日常开发中各种格式的日志文件。从简单的文本日志到 JSON 结构化日志,从单台机器到多服务关联分析,它都有一套成熟的工作流程。
核心依赖是四个经典 Unix 工具:grep、awk、jq、python3。不引入额外依赖,直接站在巨人的肩膀上。
核心功能和使用场景
1. 快速搜索错误
这是最常见的场景——线上出 bug 了,要从日志里捞问题。
# 搜索所有错误行grep -i 'error\|exception\|fatal\|panic\|fail' app.log
# 带上下文的错误搜索(前后各3行)grep -i -C 3 'error\|exception' app.log
# 按小时过滤(适合紧急查近期问题)HOUR_AGO=$(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M')awk -v t="$HOUR_AGO" '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}T/ && $1 >= t' app.log | grep -i 'error'
# 统计错误类型分布grep -oP '(?:Error|Exception): \K[^\n]+' app.log | sort | uniq -c | sort -rn | head -202. JSON 结构化日志分析
现代应用大多输出 JSON 格式日志,jq 就是神器。
# 按日志级别筛选cat app.log | jq 'select(.level == "error")'
# 按时间范围筛选cat app.log | jq 'select(.timestamp >= "2026-02-03T10:00:00Z")'
# 提取关键字段(时间、级别、消息)cat app.log | jq -r '[.timestamp, .level, .message] | @tsv'
# 按消息内容分组统计错误频率cat app.log | jq -r 'select(.level == "error") | .message' | sort | uniq -c | sort -rn
# 按 nested 字段过滤cat app.log | jq 'select(.context.userId == "user-123")'3. 堆栈跟踪分析
生产环境出异常时,堆栈信息里藏着 Root Cause。
# Java/Kotlin 堆栈提取awk '/Exception|Error/{trace=$0; while(getline && /^\t/) trace=trace"\n"$0; print trace"\n---"}' app.log
# Python traceback 提取awk '/^Traceback/{p=1} p{print} /^[A-Za-z].*Error/{if(p) print "---"; p=0}' app.log
# Node.js stack trace 提取awk '/Error:/{trace=$0; while(getline && /^ at /) trace=trace"\n"$0; print trace"\n---"}' app.log
# 去重:按 Root Cause 第一行分组awk '/Exception|Error:/{cause=$0} /^\tat|^ at /{next} cause{print cause; cause=""}' app.log | sort | uniq -c | sort -rn4. 实时监控
开发调试时盯着日志滚动,非常有用。
# 实时高亮 errors/warningstail -f app.log | grep --color=always -i 'error\|warn\|$'
# 实时过滤,只看错误tail -f app.log | grep --line-buffered -i 'error\|exception'
# JSON 日志实时 pretty-print 错误tail -f app.log | while IFS= read -r line; do level=$(echo "$line" | jq -r '.level // empty' 2>/dev/null) if [ "$level" = "error" ]; then echo "$line" | jq '.' fidone
# 多文件同时监控tail -f /var/log/service-a/app.log /var/log/service-b/app.log5. 通用访问日志解析
Nginx/Apache 格式的日志也能处理。
# 统计 Top 20 请求 IPawk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
# 统计 Top 20 请求路径awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20
# HTTP 5xx 错误分布awk '$9 >= 500 {print $9, $7}' access.log | sort | uniq -c | sort -rn | head -20
# 按分钟统计请求量awk '{split($4,a,":"); print a[1]":"a[2]":"a[3]}' access.log | uniq -c6. 多服务日志关联
微服务架构下,一次请求跨越多个服务,靠 correlation ID 串联。
# 跨文件搜索同一个请求 IDgrep -rH 'correlation-id-xyz' /var/log/service-a/ /var/log/service-b/ /var/log/service-c/
# 合并多个 JSON 日志,按时间排序,并标注来源for f in service-*.log; do service=$(basename "$f" .log) jq --arg svc "$service" '. + {source: $svc}' "$f"done | jq -s 'sort_by(.timestamp)[]'7. 结构化日志配置示例
Skill 还提供了三种主流语言的 JSON 日志配置:
Node.js (pino):
const pino = require('pino');const logger = pino({ level: process.env.LOG_LEVEL || 'info', base: { service: 'my-api', version: '1.2.0' },});// Child logger 自动带上 requestIdconst reqLogger = logger.child({ requestId: req.id });Python (structlog):
import structlogstructlog.configure( processors=[ structlog.processors.TimeStamper(fmt="iso"), structlog.processors.add_log_level, structlog.processors.JSONRenderer(), ],)Go (zerolog):
zerolog.TimeFieldFormat = zerolog.TimeFormatUnixlog.Logger = zerolog.New(os.Stdout).With(). Timestamp().Str("service", "my-api").Logger()亮点和值得关注的地方
1. 零依赖设计
只依赖 grep/awk/jq/python3,都是服务器上标配的工具,不需要额外安装任何包。
2. 覆盖全场景
从简单的文本搜索到复杂的多服务关联,从离线分析到实时监控,从单行匹配到堆栈跟踪去重,这个 skill 都有覆盖。
3. 实战导向的脚本
提供了两个可以直接用的脚本:
error-report.sh:生成错误频率报告,包括 Top 错误消息、按小时分布、首次出现时间analyze_logs.py:Python 版 JSON 日志分析,输出级别分布、错误统计、小时分布柱状图
4. 多语言日志配置示例
给出了 Node.js(pino)、Python(structlog)、Go(zerolog)三种最常用 JSON logger 的配置,直接复制就能用。
5. 实用技巧总结
最后总结了 6 条 Tips,比如用 --line-buffered 解决 tail 管道缓冲问题,用 sed 归一化 ID 后再分组去重,这些是在生产环境调试时真正能省时间的关键。
快速上手指南
第一步:确认依赖
which grep awk jq python3第二步:找错误
# 最近一小时的错误grep -i 'error\|exception' app.log | tail -50第三步:如果是 JSON 日志
# 看错误分布cat app.log | jq -r '.level' | sort | uniq -c | sort -rn
# 按消息分组统计cat app.log | jq -r 'select(.level == "error") | .message' | sort | uniq -c | sort -rn | head -10第四步:实时监控
tail -f app.log | grep --color=always -i 'error\|warn\|$'第五步(可选):生成完整报告
# 用 skill 自带的脚本bash /path/to/error-report.sh app.log总结
log-analyzer 是一个纯命令行驱动的日志分析工具,核心思路是:用 grep/awk/jq 这些已有的强大工具组合,覆盖日志分析的各个环节。不需要安装额外的服务或依赖,服务器上有什么就用什么。
最大的价值在于它的脚本库——两个可以直接跑的错误报告脚本,以及三种语言的 JSON logger 配置示例。把这些脚本在服务器上放好,遇到问题直接调出来用,比临时查文档快多了。
适用场景:生产环境问题排查、错误模式分析、日志监控配置。不适用:需要 GUI 的可视化分析、实时告警(需要配合其他工具)。
Author: 讨厌猫猫雨 | 猫猫的blog