1429 words
7 minutes
每日Skill学习 - log-analyzer

每日Skill学习 - log-analyzer#

Skill 是什么#

log-analyzer 是一个命令行驱动的日志分析技能,专门用来处理日常开发中各种格式的日志文件。从简单的文本日志到 JSON 结构化日志,从单台机器到多服务关联分析,它都有一套成熟的工作流程。

核心依赖是四个经典 Unix 工具:grepawkjqpython3。不引入额外依赖,直接站在巨人的肩膀上。

核心功能和使用场景#

1. 快速搜索错误#

这是最常见的场景——线上出 bug 了,要从日志里捞问题。

Terminal window
# 搜索所有错误行
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 -20

2. JSON 结构化日志分析#

现代应用大多输出 JSON 格式日志,jq 就是神器。

Terminal window
# 按日志级别筛选
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。

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

4. 实时监控#

开发调试时盯着日志滚动,非常有用。

Terminal window
# 实时高亮 errors/warnings
tail -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 '.'
fi
done
# 多文件同时监控
tail -f /var/log/service-a/app.log /var/log/service-b/app.log

5. 通用访问日志解析#

Nginx/Apache 格式的日志也能处理。

Terminal window
# 统计 Top 20 请求 IP
awk '{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 -c

6. 多服务日志关联#

微服务架构下,一次请求跨越多个服务,靠 correlation ID 串联。

Terminal window
# 跨文件搜索同一个请求 ID
grep -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 自动带上 requestId
const reqLogger = logger.child({ requestId: req.id });

Python (structlog)

import structlog
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.add_log_level,
structlog.processors.JSONRenderer(),
],
)

Go (zerolog)

zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
log.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 后再分组去重,这些是在生产环境调试时真正能省时间的关键。

快速上手指南#

第一步:确认依赖#

Terminal window
which grep awk jq python3

第二步:找错误#

Terminal window
# 最近一小时的错误
grep -i 'error\|exception' app.log | tail -50

第三步:如果是 JSON 日志#

Terminal window
# 看错误分布
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

第四步:实时监控#

Terminal window
tail -f app.log | grep --color=always -i 'error\|warn\|$'

第五步(可选):生成完整报告#

Terminal window
# 用 skill 自带的脚本
bash /path/to/error-report.sh app.log

总结#

log-analyzer 是一个纯命令行驱动的日志分析工具,核心思路是:用 grep/awk/jq 这些已有的强大工具组合,覆盖日志分析的各个环节。不需要安装额外的服务或依赖,服务器上有什么就用什么。

最大的价值在于它的脚本库——两个可以直接跑的错误报告脚本,以及三种语言的 JSON logger 配置示例。把这些脚本在服务器上放好,遇到问题直接调出来用,比临时查文档快多了。

适用场景:生产环境问题排查、错误模式分析、日志监控配置。不适用:需要 GUI 的可视化分析、实时告警(需要配合其他工具)。


Author: 讨厌猫猫雨 | 猫猫的blog

每日Skill学习 - log-analyzer
https://maomaoz.org/posts/daily-skill-2026-05-16/
Author
讨厌猫猫雨
Published at
2026-05-16
License
CC BY-NC-SA 4.0