日志分析器
解析、搜索和调试应用程序日志。涵盖纯文本日志、结构化JSON日志、堆栈跟踪、多服务关联和实时监控。
使用场景
- - 从日志文件中调试应用程序错误
- 搜索日志中的特定模式、错误或请求ID
- 解析和分析堆栈跟踪
- 在应用程序中设置结构化日志记录(JSON)
- 关联多个服务或日志文件中的事件
- 开发期间实时监控日志
- 生成错误频率报告或摘要
快速搜索模式
查找错误和异常
bash
日志文件中的所有错误
grep -i error\|exception\|fatal\|panic\|fail app.log
带3行上下文的错误
grep -i -C 3 error\|exception app.log
过去一小时内的错误(ISO时间戳)
HOUR_AGO=$(date -u -d 1 hour ago +%Y-%m-%dT%H:%M 2>/dev/null || date -u -v-1H +%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
从访问日志中查找HTTP 5xx错误
awk $9 >= 500 access.log
按请求ID或关联ID搜索
bash
追踪单个请求在日志条目中的记录
grep req-abc123 app.log
跨多个文件搜索
grep -r req-abc123 /var/log/myapp/
跨多个服务搜索(带文件名前缀)
grep -rH correlation-id-xyz /var/log/service-a/ /var/log/service-b/ /var/log/service-c/
时间范围过滤
bash
在两个时间戳之间(ISO格式)
awk $0 >= 2026-02-03T10:00 && $0 <= 2026-02-03T11:00 app.log
最后N行(tail)
tail -1000 app.log | grep -i error
从特定时间开始(GNU date)
awk -v start=$(date -d 30 minutes ago +%Y-%m-%dT%H:%M) $1 >= start app.log
JSON / 结构化日志
使用jq解析
bash
美化打印JSON日志
cat app.log | 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 .level | sort | uniq -c | sort -rn
按嵌套字段过滤
cat app.log | jq select(.context.userId == user-123)
按消息分组错误
cat app.log | jq -r select(.level == error) | .message | 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}
解析混合格式日志(JSON行与纯文本混合)
bash
仅提取有效的JSON行
while IFS= read -r line; do
echo $line | jq . 2>/dev/null && continue
done < app.log
或者使用grep查找以{开头的行
grep ^\s*{ app.log | jq .
堆栈跟踪分析
提取和去重堆栈跟踪
bash
提取Java/Kotlin堆栈跟踪(以Exception/Error开头,后跟\t行)
awk /Exception|Error/{trace=$0; while(getline && /^\t/) trace=trace\n$0; print trace\n---} app.log
提取Python回溯
awk /^Traceback/{p=1} p{print} /^[A-Za-z].*Error/{if(p) print ---; p=0} app.log
提取Node.js堆栈跟踪(Error + 缩进的at行)
awk /Error:/{trace=$0; while(getline && /^ at /) trace=trace\n$0; print trace\n---} app.log
去重:按根因分组(跟踪的第一行)
awk /Exception|Error:/{cause=$0} /^\tat|^ at /{next} cause{print cause; cause=} app.log | sort | uniq -c | sort -rn
Python回溯解析器
python
#!/usr/bin/env python3
从日志文件中解析Python回溯并按根因分组。
import sys
import re
from collections import Counter
def extract_tracebacks(filepath):
tracebacks = []
current = []
in_trace = False
with open(filepath) as f:
for line in f:
if line.startswith(Traceback (most recent call last):):
in_trace = True
current = [line.rstrip()]
elif in_trace:
current.append(line.rstrip())
# 异常行结束回溯
if re.match(r^[A-Za-z]\w*(Error|Exception|Warning), line):
tracebacks.append(\n.join(current))
in_trace = False
current = []
return tracebacks
if name == main:
filepath = sys.argv[1] if len(sys.argv) > 1 else /dev/stdin
traces = extract_tracebacks(filepath)
# 按异常类型和消息分组
causes = Counter()
for trace in traces:
lines = trace.split(\n)
cause = lines[-1] if lines else Unknown
causes[cause] += 1
print(f找到 {len(traces)} 个回溯,{len(causes)} 个唯一原因:\n)
for cause, count in causes.most_common(20):
print(f {count:4d}x {cause})
实时监控
跟踪和过滤
bash
跟踪日志文件,用红色高亮错误
tail -f app.log | grep --color=always -i error\|warn\|$
跟踪并仅过滤错误
tail -f app.log | grep --line-buffered -i error\|exception
跟踪JSON日志,美化打印错误
tail -f app.log | while IFS= read -r line; do
level=$(echo $line | jq -r .level // empty 2>/dev/null)
if [ $level = error ] || [ $level = fatal ]; then
echo $line | jq .
fi
done
跟踪多个文件
tail -f /var/log/service-a/app.log /var/log/service-b/app.log
带时间戳跟踪(当日志不包含时间戳时有用)
tail -f app.log | while IFS= read -r line; do
echo $(date +%H:%M:%S) $line
done
监控特定模式并告警
bash
错误时发出蜂鸣声(终端铃声)
tail -f app.log | grep --line-buffered -i error | while read line; do
echo -e \a$line
done
每分钟统计错误数
tail -f app.log | grep --line-buffered -i error | while read line; do
echo $(date +%Y-%m-%d %H:%M) ERROR
done | uniq -c
日志格式解析
常见访问日志(Apache/Nginx)
bash
解析字段:IP、日期、方法、路径、状态码、大小
awk {print $1, $9, $7} access.log
按请求数排名前20的IP
awk {print $1} access.log | sort | uniq -c | sort -rn | head -20
按请求数排名前20的路径
awk {print $7} access.log | sort | uniq -c | sort -rn | head -20
慢