日志分析与排查技能
一、使用场景(什么时候用)
软件线上故障排查:用户反馈功能异常、操作失败、系统卡顿/崩溃时,通过日志定位问题根源
批量异常排查:出现大量用户投诉同一问题(如操作失败、登录异常),需快速筛选相关日志,判断影响范围
问题复现验证:研发修复问题后,通过日志检索,验证异常是否消失、功能是否恢复正常
性能瓶颈排查:系统响应缓慢时,检索日志中的超时、耗时过长记录,定位性能瓶颈点
日志量超限处理:日志量过大(突破tokens限制),需对日志进行合并、筛选,提取核心有效信息
异常预警排查:发现系统报错率、异常率上升时,通过日志分析异常原因,提前规避大规模故障
进程状态排查:确认软件进程(如守护进程)是否被异常退出、停止或重启
二、排查方法论(标准排查流程)
核心原则:先宏观后微观,先全局后局部,先时间后内容。
2.1 六步排查法(必须遵循的标准流程)
┌─────────────────────────────────────────────────────────────────────────────┐
│ 第一步:概览分析 → 第二步:时间校验 → 第三步:范围定位 │
│ ↓ │
│ 第四步:异常聚类 → 第五步:事件链重构 → 第六步:根因定位 & 结论输出 │
└─────────────────────────────────────────────────────────────────────────────┘
第一步:概览分析(Overview)
目的:快速了解日志的基本情况,评估分析策略
执行方式:
python3 tools/smart_log.py overview --file "/path/to/app.log"
关注要点:
- 📁 文件大小:判断是否需要压缩去重
- ⏰ 时间范围:确认日志覆盖的时间区间
- 📊 级别分布:ERROR/WARN 数量,判断问题严重程度
- 🔥 高频错误类型:快速识别主要问题
第二步:时间校验(Time Validation)
目的:确认用户描述的问题时间点是否在日志覆盖范围内
常见陷阱:
- ⚠️ 用户说"15:40 出问题",但日志只到 15:36
- ⚠️ 日志时间戳格式多样,直接 grep 可能匹配错误
执行方式:
# 使用 validate 命令(推荐)
python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
# 或用 smart_log.py tail 查看末尾(推荐,带行号+时间戳)
python3 tools/smart_log.py tail --file "/path/to/app.log" --lines 50
head -50 /path/to/app.log
关键判断:
- 如果目标时间不在日志范围内,需要获取其他日志文件
- 日志截止时间本身可能就是问题发生的时刻(如进程被终止导致日志停止)
第三步:范围定位(Scope Location)
目的:缩小排查范围,聚焦问题时间段
执行方式:
python3 tools/smart_log.py timeline --file "/path/to/app.log" --start "15:35" --end "15:40"
⚠️ 时间戳精确匹配注意事项:
不同日志的时间戳格式不同,需要根据实际格式构造正则:
| 日志格式示例 |
搜索 15:40 的正则 |
[INFO][15:40:23.456] |
\[15:40 |
2024-02-06 15:40:23 INFO |
15:40: |
15:40:23.456 [INFO] |
^15:40 |
第四步:异常聚类(Error Clustering)
目的:将大量错误日志聚类分析,识别主要问题
执行方式:
python3 tools/smart_log.py errors --file "/path/to/app.log" --start "15:35" --end "15:40" --top 20
分析技巧:
- 关注突然激增的错误类型
- 对比正常时段和异常时段的错误分布
- 注意错误之间的时序关系
第五步:事件链重构(Event Chain Reconstruction)
目的:通过上下文关联,还原问题发生的完整链路
执行方式:
# 推荐:使用 chain 命令
python3 tools/smart_log.py chain --file "/path/to/app.log" \
--start "15:35" --end "15:40" \
--events "start,stop,init,exit,connect,disconnect"
# 或使用 search 命令
python3 tools/smart_log.py search --file "/path/to/app.log" \
--keyword "exit|stop|quit|shutdown|disconnect|terminate" \
--start "15:35" --end "15:40" \
--dedupe --context 3
第六步:根因定位 & 结论输出
目的:基于日志证据,定位根本原因,输出结构化结论
结论模板:
## 📊 日志分析结论
### ⚠️ 问题现象
- [描述用户反馈的问题现象]
### 🔴 关键发现
| 时间 | 事件 | 日志证据 |
|------|------|----------|
| 15:35:03 | xxx | 具体日志内容(行号) |
### 🔍 根因分析
- 直接原因:[具体描述]
- 根本原因:[深层原因]
### 💡 建议
1. [可执行的建议1]
2. [可执行的建议2]
2.2 智能关键词推导
根据用户问题语义推导搜索关键词:
| 问题类型 |
推导关键词 |
| 断网/网络问题 |
disconnect, timeout, unreachable, network, connection, refused |
| 进程退出 |
exit, quit, stop, terminate, crash, killed, signal, shutdown |
| 登录失败 |
auth, login, fail, denied, unauthorized, 401, 403 |
| 配置问题 |
config, invalid, parse error, load, init, missing |
| 性能问题 |
slow, timeout, latency, queue, backlog, OOM, memory |
| 通用异常 |
error, warn, fail, exception, critical, fatal |
三、核心能力
3.1 日志检索与筛选
- 根据指定时间段、关键词(报错提示、接口/操作ID、设备ID)主动检索日志,高效过滤无关信息
- 熟练处理常见日志格式(JSON/文本/XML/Windows日志),快速提取关键信息(操作状态、报错堆栈、参数)
- 使用允许的工具独立完成日志检索,无需用户额外指导
- ⚠️ 必须先确认时间戳格式,再构造精确的搜索正则
3.2 异常识别与根因分析
- 自动识别各类日志异常(操作中断、接口报错、超时、权限/配置错误、进程退出)
- 通过日志上下文关联重构问题链路,精准判断问题类型(网络、配置、接口、环境问题)
- 区分偶发/批量问题、环境/产品问题,基于日志证据定位根因,确保判断严谨
- ⚠️ 日志截止时间本身可能是重要线索(如进程被杀导致日志停止)
3.3 排查结果落地
- 将日志分析过程与结果转化为结构化结论,明确说明问题现象、日志证据及根因
- 针对简单问题提供可落地的解决方案,针对复杂问题给出清晰的排查方向,支撑问题闭环
- 整理排查案例,形成可复用经验
- ⚠️ 结论必须有明确的日志行号、时间戳作为证据支撑
3.4 日志合并与精简
- 当日志量过大、突破tokens限制时,通过工具对日志进行合并、去重、精简
- 保留核心异常信息和关键链路日志,剔除重复、无效日志
- 确保排查高效且不遗漏关键线索
四、辅助能力
4.1 问题拆解与协作
- 精准拆解用户描述的问题现象,抓取日志检索核心维度,提升排查针对性
- 与研发、业务等协作方清晰沟通,同步排查进度与线索,推动协同解决问题
4.2 产品与技术认知
- 熟悉软件核心业务流程与接口逻辑,结合业务场景判断日志异常的合理性
- 具备基础的网络、服务器、数据库常识,初步判断环境因素对日志异常的影响
4.3 工具与文档使用
- 熟练使用各类日志工具完成检索、合并、分析
- 使用Excel、WPS整理日志及排查记录,生成标准化报告
- 掌握远程协助、日志提取工具,高效获取目标日志,提升排查效率
五、常见问题及应对方法
问题1:日志量过大,检索缓慢、突破tokens限制
应对:
- 先通过工具筛选(指定时间段、核心关键词)缩小日志范围
- 对同类型、重复日志进行合并去重
- 提取日志核心字段(时间、报错信息、操作ID),剔除冗余字段,减少日志体积
- 使用
smart_log.py search --dedupe 智能去重
问题2:用户描述的时间点不在日志范围内
应对:
- 首先用
smart_log.py validate 确认日志实际时间范围
- 如果时间不匹配,询问用户是否有其他日志文件
- 日志截止时间本身可能就是问题发生时刻(进程退出导致日志停止)
- 检查是否有多个日志文件需要合并分析
问题3:日志无明确报错信息,无法定位异常
应对:
- 检索操作前后的上下文日志,排查是否有隐性异常(如参数缺失、接口返回空值)
- 结合业务流程,判断操作是否符合预期,排查流程中断点
- 使用
smart_log.py chain 分析事件链,还原问题发生链路
- 搜索 init/start/stop/exit 等状态变化关键词
问题4:日志格式不统一(混合JSON/文本),提取信息困难
应对:
- 使用jq、sed等工具标准化日志格式
- 优先提取结构化日志(JSON)的关键字段,非结构化日志通过正则表达式提取核心信息
- 将混合格式日志转换为统一格式后再进行分析
问题5:检索关键词不准确,遗漏关键日志
应对:
- 结合问题现象,扩展关键词(如报错的不同表述、相关接口名称、操作动作)
- 使用模糊检索、多关键词组合检索
- 排查日志中是否有同义异常提示,补充检索条件
- 参考上方"智能关键词推导"表扩展搜索范围
问题6:时间戳格式复杂,直接搜索匹配错误
应对:
- 先用
smart_log.py overview 确认日志的时间戳格式
- 根据实际格式构造精确的正则表达式
- 使用
\[15:40 或 ^15:40 等精确匹配避免误匹配
六、正例与反例(实战案例)
(一)正例:服务进程异常退出排查
场景:用户反馈"15:40 左右服务不可用,怀疑服务进程被异常停止"
正确排查步骤:
# 步骤1:获取日志概览
python3 tools/smart_log.py overview --file "/path/to/app.log"
# 输出:时间范围 14:33 - 15:36,发现日志在 15:36 截止
# 步骤2:验证时间范围
python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
# 输出:⚠️ 目标时间 15:40 晚于日志结束时间 15:36:47
# 步骤3:分析日志截止前的错误情况
python3 tools/smart_log.py errors --file "/path/to/app.log" --start "15:25" --end "15:37" --top 20
# 发现:15:27 有 418 条错误,存在异常高峰
# 步骤4:搜索进程停止相关日志
python3 tools/smart_log.py search --file "/path/to/app.log" \
--keyword "stop|exit|init|quit|shutdown" --start "15:27" --end "15:28" --context 3
# 发现:15:27:04 有 "STOP Service..." 和 "StopService" 日志
# 步骤5:重构事件链
python3 tools/smart_log.py chain --file "/path/to/app.log" \
--start "15:27:00" --end "15:27:10" --events "stop,exit,init,instance,start"
# 输出:完整的启动→初始化失败→停止事件序列
结论输出:
## 📊 日志分析结论
### ⚠️ 重要发现
日志文件时间范围是 **14:33:59 - 15:36:47**,不包含 15:40。
日志在 **15:36:47** 停止,之后没有更多记录。
### 🔴 关键事件链(15:27 服务进程被停止)
| 时间 | 事件 | 说明 |
|------|------|------|
| 15:27:03.525 | 新进程启动 | PID 31224,参数 --mode=restart |
| 15:27:03.665 | InitInstance() return false | 管理程序初始化失败 |
| 15:27:04.881 | StopService 被调用 | 开始停止服务 |
| 15:27:04.884 | STOP Service... | 服务正在被停止 |
### 🔍 根因分析
**是的,服务进程在 15:27:04 被停止了。**
触发原因:
1. 15:27:03 - 系统启动了新的 app_tray.exe 进程
2. 该进程初始化失败(InitInstance() return false)
3. 初始化失败触发了服务停止流程
### 💡 建议
1. 检查为什么 app_tray.exe 初始化失败
2. 检查服务自身的日志文件获取更多细节
3. 如需分析 15:40 的情况,需要提供那个时间段的日志
(二)反例(错误操作)
场景:用户反馈"15:40 断网"
错误操作:
❌ 直接搜索 grep "15:40" app.log,但日志时间戳格式是 [15:40:xx],导致匹配到其他包含"15:40"的内容
❌ 没有先确认日志时间范围,浪费时间搜索不存在的时间段
❌ 只看 ERROR 级别日志,忽略了 INFO 级别中的"StopService"等关键状态变化
❌ 只给出"网络有问题"的模糊结论,没有具体的日志证据和时间点
❌ 没有注意到日志在 15:36 截止这个重要线索
七、网络异常排障流程
当用户反馈"连接突然断开"、"时间不固定"、"每个日志都可能有重要信息"时使用此流程。
7.1 快速排查三步法
# 步骤1:对所有日志做概览,确认格式识别正常(高价值日志 > 0)
python3 tools/smart_log.py overview --file "/path/to/client.log"
# 步骤2:用 --preset disconnect 一键搜索断连相关关键词
python3 tools/smart_log.py search --file "/path/to/client.log" \
--preset disconnect --dedupe --limit 20
# 步骤3:对匹配结果中的时间点,用服务端日志交叉验证
python3 tools/smart_log.py search --file "/path/to/server.log" \
--preset disconnect --start "10:43" --end "10:44" --dedupe --limit 10
7.2 预设关键词组
| 预设名 |
覆盖关键词 |
适用场景 |
disconnect |
disconnect, reconnect, close, closed, reset, broken, drop, timeout, refuse, refused, dead, lost, abort, shutdown, detach, bye |
断连/重连排查(默认首选) |
error |
error, fail, failed, failure, panic, fatal, crash, exception |
错误聚类排查 |
network |
timeout, refuse, reset, broken, drop, unreachable, dns, proxy, tls, ssl, cert |
网络层排查 |
auth |
auth, denied, unauthorized, forbidden, token, login, logout, expire |
认证/权限排查 |
7.3 支持的日志格式
| 格式 |
示例 |
说明 |
| glog |
I0617 10:35:32.640599 4304 service.go:120] msg |
Go 程序常用 |
| 标准 [LEVEL][time] |
[ERROR][2024-01-01 15:40:23.456] |
通用 |
| ISO 8601 |
2024-01-01T15:40:23.456Z |
标准 |
| 自定义时间戳 |
[ INFO][15:12:01.877][app.exe 3556.3560][module.cpp@234] |
多模块程序 |
7.4 断连排障结论模板
## 断连排查结论
### 客户端日志
| 时间 | 事件 | 行号 | 日志摘要(≤200字符) |
|------|------|------|---------------------|
| 10:43:57 | DNS upstream closed | 10932 | `use of closed network connection` |
### 服务端日志
| 时间 | 事件 | 行号 | 日志摘要(≤200字符) |
|------|------|------|---------------------|
| 10:43:55 | Session reset | 8773 | `session force reset by peer` |
### 交叉验证
- 客户端 10:43:57 报 DNS closed → 服务端 10:43:55 已 reset session
- 时间差 2 秒,服务端先于客户端,断连由服务端发起
### 根因
[基于交叉验证的根因判断]
7.5 注意事项
- 多日志交叉验证:客户端日志 + 服务端日志必须按时间对齐分析
- 时间不固定场景:对所有日志逐个跑
--preset disconnect,每个有匹配的都要记录
- glog 格式特性:Go 程序日志可能全为 INFO 级别(glog
I 前缀),不代表无异常——断连信息在 INFO 内容中
- 输出已截断:search 结果每条内容 ≤200 字符,行号+时间戳+截断内容,安全传递给 AI 模型分析
八、配套工具
智能日志分析工具(smart_log.py)
本技能的核心分析工具,专为处理大型日志文件设计。
工具路径
skills/log-analysis-troubleshooting/tools/smart_log.py
命令列表
| 命令 |
用途 |
典型场景 |
overview |
获取日志概览 |
排查第一步,了解基本情况 |
validate |
时间范围验证 |
确认目标时间是否在日志中 |
search |
智能搜索(支持去重) |
搜索特定关键词/时间段 |
search --preset disconnect |
预设关键词搜索 |
断连排查一键搜索 |
errors |
错误聚类分析 |
了解错误分布,识别主要问题 |
timeline |
时间线分析 |
查看关键事件时序 |
chain |
事件链分析 |
重构问题发生链路 |
tail |
查看末尾N行 |
进程退出前最后日志、快速验证日志截止点 |
trace |
ID 追踪 |
追踪特定请求/会话 |
使用示例
# 1. 获取日志概览(必做第一步)
python3 tools/smart_log.py overview --file "/path/to/app.log"
# 2. 验证时间范围
python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
# 3. 智能搜索(带去重和上下文)
python3 tools/smart_log.py search --file "/path/to/app.log" \
--keyword "error|fail|timeout" \
--start "15:35" --end "15:45" \
--dedupe --context 3
# 4. 错误聚类分析
python3 tools/smart_log.py errors --file "/path/to/app.log" \
--start "15:35" --end "15:45" --top 20
# 5. 时间线分析
python3 tools/smart_log.py timeline --file "/path/to/app.log" \
--start "15:35" --end "15:45" --events 30
# 6. 事件链分析
python3 tools/smart_log.py chain --file "/path/to/app.log" \
--start "15:35" --end "15:45" \
--events "start,stop,init,exit,connect,disconnect"
# 7. 追踪特定 ID
python3 tools/smart_log.py trace --file "/path/to/app.log" \
--trace-id "req-12345" --context 3
# 8. 查看日志末尾(进程退出前最后记录)
python3 tools/smart_log.py tail --file "/path/to/app.log" --lines 50
基础 Shell 工具
| 工具 |
核心用途 |
示例 |
grep |
关键词搜索 |
grep -n "error" app.log |
grep -c |
统计匹配行数 |
grep -c "\[15:40" app.log |
grep -iE |
多关键词搜索 |
grep -iE "err|fail|timeout" app.log |
head |
查看开头 |
head -50 app.log |
tail |
查看结尾 |
tail -100 app.log |
wc -l |
统计行数 |
wc -l app.log |
awk |
字段提取 |
awk '{print $1,$3}' app.log |
sed |
格式转换 |
sed 's/old/new/g' app.log |
jq |
JSON 解析 |
cat app.log | jq '.error' |
日志合并核心方法(解决tokens超限问题)
方法1:按异常类型合并 —— 将同类型报错的日志合并,保留1条完整报错日志+其他日志的关键信息(时间、用户ID),剔除重复的报错堆栈
方法2:按时间段合并 —— 将同一时间段(如每10分钟)的日志合并,提取该时间段内的异常类型、影响数量,无需保留每条日志的完整内容
方法3:字段精简合并 —— 只保留日志中的核心字段(时间、异常类型、接口/操作ID、用户ID),删除冗余描述、无关参数,缩小日志体积
方法4:智能去重 —— 使用 smart_log.py search --dedupe,自动识别重复模式,只保留代表性样本
九、行为准则
遵循六步排查法:概览 → 时间校验 → 范围定位 → 异常聚类 → 事件链重构 → 根因定位
先确认时间范围:任何搜索前,必须先确认日志的实际时间覆盖范围
精确匹配时间戳:根据日志实际格式构造正则,避免误匹配
排查全程留存日志证据:所有判断必须基于实际日志内容,确保可追溯
结构化输出结论:使用表格、时间线等形式清晰展示分析结果
不提出不必要的问题:主动提供全面的日志分析结果及排查建议
日志截止时间是重要线索:进程退出可能导致日志停止写入
当日志量过大时:优先使用 smart_log.py --dedupe 进行智能去重
禁止重复执行(防死循环铁律):
- 同一文件、同一命令、同一参数的组合,不得重复执行——如果上次有结果,直接用上次的结果
- 同一文件的
overview 只需执行 1 次,后续分析直接引用结果
- 连续 2 次工具调用未能获得新信息时,立即停止搜索,基于已有证据输出结论
- 如果觉得"上次没看全",改用不同命令或不同参数(如换
tail 替代重复 search),而非重复同一命令
- 排障最多 15 次工具调用,超过后必须输出当前结论
🔴🔴🔴 日志证据原则(最高优先级)🔴🔴🔴
所有分析结论必须有日志证据支撑,严禁臆造!
核心要求
| 要求 |
说明 |
违规示例 |
| 有据可查 |
每个结论必须指向具体的日志条目 |
❌ "可能是网络问题" |
| 禁止推测 |
不能基于经验或常识推断根因 |
❌ "通常这种情况是..." |
| 禁止臆造 |
不能编造不存在的日志内容 |
❌ 未检索就描述日志细节 |
| 证据先行 |
先找到日志,再得出结论 |
❌ 先下结论再找日志 |
证据标准
有效证据:
✅ 检索到了具体的日志条目
✅ 引用了关键日志行(包含时间戳和行号)
✅ 分析了日志中的错误码/异常信息
✅ 展示了时间线上的事件序列
无效证据:
❌ 仅凭问题描述推断("断网应该是网络问题")
❌ 基于经验推断("这种情况一般是配置错误")
❌ 未检索就下结论("根据常见原因分析...")
❌ 编造日志内容(未实际检索到的日志)
强制自检清单
在输出任何结论前,必须确认:
□ 我是否实际使用 smart_log.py 检索了相关日志?
□ 我的结论是否基于具体的日志条目(有行号、有时间戳),而非推测?
□ 如果用户追问"你怎么知道的",我能引用具体日志行吗?
□ 我是否区分了"日志中记录的"和"我认为应该是"?
□ 我是否遵循了六步排查法,而非跳步直接结论?
1---2name: log-analysis-troubleshooting3description: 当用户需要使用日志排查软件问题时,主动检索、筛选并分析日志内容;识别异常、定位根因,并提供清晰的排查方向。适用于处理日志相关排查任务,包括关键词检索、异常识别、根因分析等场景。可解决日志量大、检索低效、异常定位模糊等问题,提供工具适配及日志合并方案,辅助高效完成排查。4---5
6# 日志分析与排查技能
7
8## 一、使用场景(什么时候用)
9
10- **软件线上故障排查**:用户反馈功能异常、操作失败、系统卡顿/崩溃时,通过日志定位问题根源
11
12- **批量异常排查**:出现大量用户投诉同一问题(如操作失败、登录异常),需快速筛选相关日志,判断影响范围
13
14- **问题复现验证**:研发修复问题后,通过日志检索,验证异常是否消失、功能是否恢复正常
15
16- **性能瓶颈排查**:系统响应缓慢时,检索日志中的超时、耗时过长记录,定位性能瓶颈点
17
18- **日志量超限处理**:日志量过大(突破tokens限制),需对日志进行合并、筛选,提取核心有效信息
19
20- **异常预警排查**:发现系统报错率、异常率上升时,通过日志分析异常原因,提前规避大规模故障
21
22- **进程状态排查**:确认软件进程(如守护进程)是否被异常退出、停止或重启
23
24## 二、排查方法论(标准排查流程)
25
26> **核心原则**:先宏观后微观,先全局后局部,先时间后内容。
27
28### 2.1 六步排查法(必须遵循的标准流程)
29
30```
31┌─────────────────────────────────────────────────────────────────────────────┐
32│ 第一步:概览分析 → 第二步:时间校验 → 第三步:范围定位 │
33│ ↓ │
34│ 第四步:异常聚类 → 第五步:事件链重构 → 第六步:根因定位 & 结论输出 │
35└─────────────────────────────────────────────────────────────────────────────┘
36```
37
38#### 第一步:概览分析(Overview)
39
40**目的**:快速了解日志的基本情况,评估分析策略
41
42**执行方式**:
43```bash
44python3 tools/smart_log.py overview --file "/path/to/app.log"
45```
46
47**关注要点**:
48- 📁 文件大小:判断是否需要压缩去重
49- ⏰ 时间范围:确认日志覆盖的时间区间
50- 📊 级别分布:ERROR/WARN 数量,判断问题严重程度
51- 🔥 高频错误类型:快速识别主要问题
52
53#### 第二步:时间校验(Time Validation)
54
55**目的**:确认用户描述的问题时间点是否在日志覆盖范围内
56
57**常见陷阱**:
58- ⚠️ 用户说"15:40 出问题",但日志只到 15:36
59- ⚠️ 日志时间戳格式多样,直接 grep 可能匹配错误
60
61**执行方式**:
62```bash
63# 使用 validate 命令(推荐)
64python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
65
66# 或用 smart_log.py tail 查看末尾(推荐,带行号+时间戳)
67python3 tools/smart_log.py tail --file "/path/to/app.log" --lines 50
68head -50 /path/to/app.log
69```
70
71**关键判断**:
72- 如果目标时间不在日志范围内,需要获取其他日志文件
73- 日志截止时间本身可能就是问题发生的时刻(如进程被终止导致日志停止)
74
75#### 第三步:范围定位(Scope Location)
76
77**目的**:缩小排查范围,聚焦问题时间段
78
79**执行方式**:
80```bash
81python3 tools/smart_log.py timeline --file "/path/to/app.log" --start "15:35" --end "15:40"
82```
83
84**⚠️ 时间戳精确匹配注意事项**:
85
86不同日志的时间戳格式不同,需要根据实际格式构造正则:
87
88| 日志格式示例 | 搜索 15:40 的正则 |
89|-------------|------------------|
90| `[INFO][15:40:23.456]` | `\[15:40` |
91| `2024-02-06 15:40:23 INFO` | `15:40:` |
92| `15:40:23.456 [INFO]` | `^15:40` |
93
94#### 第四步:异常聚类(Error Clustering)
95
96**目的**:将大量错误日志聚类分析,识别主要问题
97
98**执行方式**:
99```bash
100python3 tools/smart_log.py errors --file "/path/to/app.log" --start "15:35" --end "15:40" --top 20
101```
102
103**分析技巧**:
104- 关注突然激增的错误类型
105- 对比正常时段和异常时段的错误分布
106- 注意错误之间的时序关系
107
108#### 第五步:事件链重构(Event Chain Reconstruction)
109
110**目的**:通过上下文关联,还原问题发生的完整链路
111
112**执行方式**:
113```bash
114# 推荐:使用 chain 命令
115python3 tools/smart_log.py chain --file "/path/to/app.log" \
116 --start "15:35" --end "15:40" \
117 --events "start,stop,init,exit,connect,disconnect"
118
119# 或使用 search 命令
120python3 tools/smart_log.py search --file "/path/to/app.log" \
121 --keyword "exit|stop|quit|shutdown|disconnect|terminate" \
122 --start "15:35" --end "15:40" \
123 --dedupe --context 3
124```
125
126#### 第六步:根因定位 & 结论输出
127
128**目的**:基于日志证据,定位根本原因,输出结构化结论
129
130**结论模板**:
131```markdown
132## 📊 日志分析结论
133
134### ⚠️ 问题现象
135- [描述用户反馈的问题现象]
136
137### 🔴 关键发现
138| 时间 | 事件 | 日志证据 |
139|------|------|----------|
140| 15:35:03 | xxx | 具体日志内容(行号) |
141
142### 🔍 根因分析
143- 直接原因:[具体描述]
144- 根本原因:[深层原因]
145
146### 💡 建议
1471. [可执行的建议1]
1482. [可执行的建议2]
149```
150
151### 2.2 智能关键词推导
152
153根据用户问题语义推导搜索关键词:
154
155| 问题类型 | 推导关键词 |
156|----------|-----------|
157| 断网/网络问题 | disconnect, timeout, unreachable, network, connection, refused |
158| 进程退出 | exit, quit, stop, terminate, crash, killed, signal, shutdown |
159| 登录失败 | auth, login, fail, denied, unauthorized, 401, 403 |
160| 配置问题 | config, invalid, parse error, load, init, missing |
161| 性能问题 | slow, timeout, latency, queue, backlog, OOM, memory |
162| 通用异常 | error, warn, fail, exception, critical, fatal |
163
164## 三、核心能力
165
166### 3.1 日志检索与筛选
167
168- 根据指定时间段、关键词(报错提示、接口/操作ID、设备ID)主动检索日志,高效过滤无关信息
169- 熟练处理常见日志格式(JSON/文本/XML/Windows日志),快速提取关键信息(操作状态、报错堆栈、参数)
170- 使用允许的工具独立完成日志检索,无需用户额外指导
171- **⚠️ 必须先确认时间戳格式,再构造精确的搜索正则**
172
173### 3.2 异常识别与根因分析
174
175- 自动识别各类日志异常(操作中断、接口报错、超时、权限/配置错误、进程退出)
176- 通过日志上下文关联重构问题链路,精准判断问题类型(网络、配置、接口、环境问题)
177- 区分偶发/批量问题、环境/产品问题,基于日志证据定位根因,确保判断严谨
178- **⚠️ 日志截止时间本身可能是重要线索(如进程被杀导致日志停止)**
179
180### 3.3 排查结果落地
181
182- 将日志分析过程与结果转化为结构化结论,明确说明问题现象、日志证据及根因
183- 针对简单问题提供可落地的解决方案,针对复杂问题给出清晰的排查方向,支撑问题闭环
184- 整理排查案例,形成可复用经验
185- **⚠️ 结论必须有明确的日志行号、时间戳作为证据支撑**
186
187### 3.4 日志合并与精简
188
189- 当日志量过大、突破tokens限制时,通过工具对日志进行合并、去重、精简
190- 保留核心异常信息和关键链路日志,剔除重复、无效日志
191- 确保排查高效且不遗漏关键线索
192
193## 四、辅助能力
194
195### 4.1 问题拆解与协作
196
197- 精准拆解用户描述的问题现象,抓取日志检索核心维度,提升排查针对性
198- 与研发、业务等协作方清晰沟通,同步排查进度与线索,推动协同解决问题
199
200### 4.2 产品与技术认知
201
202- 熟悉软件核心业务流程与接口逻辑,结合业务场景判断日志异常的合理性
203- 具备基础的网络、服务器、数据库常识,初步判断环境因素对日志异常的影响
204
205### 4.3 工具与文档使用
206
207- 熟练使用各类日志工具完成检索、合并、分析
208- 使用Excel、WPS整理日志及排查记录,生成标准化报告
209- 掌握远程协助、日志提取工具,高效获取目标日志,提升排查效率
210
211## 五、常见问题及应对方法
212
213### 问题1:日志量过大,检索缓慢、突破tokens限制
214
215**应对**:
216- 先通过工具筛选(指定时间段、核心关键词)缩小日志范围
217- 对同类型、重复日志进行合并去重
218- 提取日志核心字段(时间、报错信息、操作ID),剔除冗余字段,减少日志体积
219- **使用 `smart_log.py search --dedupe` 智能去重**
220
221### 问题2:用户描述的时间点不在日志范围内
222
223**应对**:
224- **首先用 `smart_log.py validate` 确认日志实际时间范围**
225- 如果时间不匹配,询问用户是否有其他日志文件
226- 日志截止时间本身可能就是问题发生时刻(进程退出导致日志停止)
227- 检查是否有多个日志文件需要合并分析
228
229### 问题3:日志无明确报错信息,无法定位异常
230
231**应对**:
232- 检索操作前后的上下文日志,排查是否有隐性异常(如参数缺失、接口返回空值)
233- 结合业务流程,判断操作是否符合预期,排查流程中断点
234- 使用 `smart_log.py chain` 分析事件链,还原问题发生链路
235- **搜索 init/start/stop/exit 等状态变化关键词**
236
237### 问题4:日志格式不统一(混合JSON/文本),提取信息困难
238
239**应对**:
240- 使用jq、sed等工具标准化日志格式
241- 优先提取结构化日志(JSON)的关键字段,非结构化日志通过正则表达式提取核心信息
242- 将混合格式日志转换为统一格式后再进行分析
243
244### 问题5:检索关键词不准确,遗漏关键日志
245
246**应对**:
247- 结合问题现象,扩展关键词(如报错的不同表述、相关接口名称、操作动作)
248- 使用模糊检索、多关键词组合检索
249- 排查日志中是否有同义异常提示,补充检索条件
250- **参考上方"智能关键词推导"表扩展搜索范围**
251
252### 问题6:时间戳格式复杂,直接搜索匹配错误
253
254**应对**:
255- **先用 `smart_log.py overview` 确认日志的时间戳格式**
256- 根据实际格式构造精确的正则表达式
257- 使用 `\[15:40` 或 `^15:40` 等精确匹配避免误匹配
258
259## 六、正例与反例(实战案例)
260
261### (一)正例:服务进程异常退出排查
262
263#### 场景:用户反馈"15:40 左右服务不可用,怀疑服务进程被异常停止"
264
265**正确排查步骤**:
266
267```bash
268# 步骤1:获取日志概览
269python3 tools/smart_log.py overview --file "/path/to/app.log"
270# 输出:时间范围 14:33 - 15:36,发现日志在 15:36 截止
271
272# 步骤2:验证时间范围
273python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
274# 输出:⚠️ 目标时间 15:40 晚于日志结束时间 15:36:47
275
276# 步骤3:分析日志截止前的错误情况
277python3 tools/smart_log.py errors --file "/path/to/app.log" --start "15:25" --end "15:37" --top 20
278# 发现:15:27 有 418 条错误,存在异常高峰
279
280# 步骤4:搜索进程停止相关日志
281python3 tools/smart_log.py search --file "/path/to/app.log" \
282 --keyword "stop|exit|init|quit|shutdown" --start "15:27" --end "15:28" --context 3
283# 发现:15:27:04 有 "STOP Service..." 和 "StopService" 日志
284
285# 步骤5:重构事件链
286python3 tools/smart_log.py chain --file "/path/to/app.log" \
287 --start "15:27:00" --end "15:27:10" --events "stop,exit,init,instance,start"
288# 输出:完整的启动→初始化失败→停止事件序列
289```
290
291**结论输出**:
292
293```markdown
294## 📊 日志分析结论
295
296### ⚠️ 重要发现
297日志文件时间范围是 **14:33:59 - 15:36:47**,不包含 15:40。
298日志在 **15:36:47** 停止,之后没有更多记录。
299
300### 🔴 关键事件链(15:27 服务进程被停止)
301
302| 时间 | 事件 | 说明 |
303|------|------|------|
304| 15:27:03.525 | 新进程启动 | PID 31224,参数 --mode=restart |
305| 15:27:03.665 | InitInstance() return false | 管理程序初始化失败 |
306| 15:27:04.881 | StopService 被调用 | 开始停止服务 |
307| 15:27:04.884 | STOP Service... | 服务正在被停止 |
308
309### 🔍 根因分析
310**是的,服务进程在 15:27:04 被停止了。**
311
312触发原因:
3131. 15:27:03 - 系统启动了新的 app_tray.exe 进程
3142. 该进程初始化失败(InitInstance() return false)
3153. 初始化失败触发了服务停止流程
316
317### 💡 建议
3181. 检查为什么 app_tray.exe 初始化失败
3192. 检查服务自身的日志文件获取更多细节
3203. 如需分析 15:40 的情况,需要提供那个时间段的日志
321```
322
323### (二)反例(错误操作)
324
325#### 场景:用户反馈"15:40 断网"
326
327**错误操作**:
328
3291. ❌ 直接搜索 `grep "15:40" app.log`,但日志时间戳格式是 `[15:40:xx]`,导致匹配到其他包含"15:40"的内容
330
3312. ❌ 没有先确认日志时间范围,浪费时间搜索不存在的时间段
332
3333. ❌ 只看 ERROR 级别日志,忽略了 INFO 级别中的"StopService"等关键状态变化
334
3354. ❌ 只给出"网络有问题"的模糊结论,没有具体的日志证据和时间点
336
3375. ❌ 没有注意到日志在 15:36 截止这个重要线索
338
339## 七、网络异常排障流程
340
341> 当用户反馈"连接突然断开"、"时间不固定"、"每个日志都可能有重要信息"时使用此流程。
342
343### 7.1 快速排查三步法
344
345```bash
346# 步骤1:对所有日志做概览,确认格式识别正常(高价值日志 > 0)
347python3 tools/smart_log.py overview --file "/path/to/client.log"
348
349# 步骤2:用 --preset disconnect 一键搜索断连相关关键词
350python3 tools/smart_log.py search --file "/path/to/client.log" \
351 --preset disconnect --dedupe --limit 20
352
353# 步骤3:对匹配结果中的时间点,用服务端日志交叉验证
354python3 tools/smart_log.py search --file "/path/to/server.log" \
355 --preset disconnect --start "10:43" --end "10:44" --dedupe --limit 10
356```
357
358### 7.2 预设关键词组
359
360| 预设名 | 覆盖关键词 | 适用场景 |
361|--------|-----------|----------|
362| `disconnect` | disconnect, reconnect, close, closed, reset, broken, drop, timeout, refuse, refused, dead, lost, abort, shutdown, detach, bye | 断连/重连排查(默认首选) |
363| `error` | error, fail, failed, failure, panic, fatal, crash, exception | 错误聚类排查 |
364| `network` | timeout, refuse, reset, broken, drop, unreachable, dns, proxy, tls, ssl, cert | 网络层排查 |
365| `auth` | auth, denied, unauthorized, forbidden, token, login, logout, expire | 认证/权限排查 |
366
367### 7.3 支持的日志格式
368
369| 格式 | 示例 | 说明 |
370|------|------|------|
371| **glog** | `I0617 10:35:32.640599 4304 service.go:120] msg` | Go 程序常用 |
372| 标准 [LEVEL][time] | `[ERROR][2024-01-01 15:40:23.456]` | 通用 |
373| ISO 8601 | `2024-01-01T15:40:23.456Z` | 标准 |
374| 自定义时间戳 | `[ INFO][15:12:01.877][app.exe 3556.3560][module.cpp@234]` | 多模块程序 |
375
376### 7.4 断连排障结论模板
377
378```markdown
379## 断连排查结论
380
381### 客户端日志
382| 时间 | 事件 | 行号 | 日志摘要(≤200字符) |
383|------|------|------|---------------------|
384| 10:43:57 | DNS upstream closed | 10932 | `use of closed network connection` |
385
386### 服务端日志
387| 时间 | 事件 | 行号 | 日志摘要(≤200字符) |
388|------|------|------|---------------------|
389| 10:43:55 | Session reset | 8773 | `session force reset by peer` |
390
391### 交叉验证
392- 客户端 10:43:57 报 DNS closed → 服务端 10:43:55 已 reset session
393- 时间差 2 秒,服务端先于客户端,断连由服务端发起
394
395### 根因
396[基于交叉验证的根因判断]
397```
398
399### 7.5 注意事项
400
401- **多日志交叉验证**:客户端日志 + 服务端日志必须按时间对齐分析
402- **时间不固定场景**:对所有日志逐个跑 `--preset disconnect`,每个有匹配的都要记录
403- **glog 格式特性**:Go 程序日志可能全为 INFO 级别(glog `I` 前缀),不代表无异常——断连信息在 INFO 内容中
404- **输出已截断**:search 结果每条内容 ≤200 字符,行号+时间戳+截断内容,安全传递给 AI 模型分析
405
406## 八、配套工具
407
408### 智能日志分析工具(smart_log.py)
409
410本技能的核心分析工具,专为处理大型日志文件设计。
411
412#### 工具路径
413
414```
415skills/log-analysis-troubleshooting/tools/smart_log.py
416```
417
418#### 命令列表
419
420| 命令 | 用途 | 典型场景 |
421|------|------|----------|
422| `overview` | 获取日志概览 | 排查第一步,了解基本情况 |
423| `validate` | 时间范围验证 | 确认目标时间是否在日志中 |
424| `search` | 智能搜索(支持去重) | 搜索特定关键词/时间段 |
425| `search --preset disconnect` | 预设关键词搜索 | 断连排查一键搜索 |
426| `errors` | 错误聚类分析 | 了解错误分布,识别主要问题 |
427| `timeline` | 时间线分析 | 查看关键事件时序 |
428| `chain` | 事件链分析 | 重构问题发生链路 |
429| `tail` | 查看末尾N行 | 进程退出前最后日志、快速验证日志截止点 |
430| `trace` | ID 追踪 | 追踪特定请求/会话 |
431
432#### 使用示例
433
434```bash
435# 1. 获取日志概览(必做第一步)
436python3 tools/smart_log.py overview --file "/path/to/app.log"
437
438# 2. 验证时间范围
439python3 tools/smart_log.py validate --file "/path/to/app.log" --time "15:40"
440
441# 3. 智能搜索(带去重和上下文)
442python3 tools/smart_log.py search --file "/path/to/app.log" \
443 --keyword "error|fail|timeout" \
444 --start "15:35" --end "15:45" \
445 --dedupe --context 3
446
447# 4. 错误聚类分析
448python3 tools/smart_log.py errors --file "/path/to/app.log" \
449 --start "15:35" --end "15:45" --top 20
450
451# 5. 时间线分析
452python3 tools/smart_log.py timeline --file "/path/to/app.log" \
453 --start "15:35" --end "15:45" --events 30
454
455# 6. 事件链分析
456python3 tools/smart_log.py chain --file "/path/to/app.log" \
457 --start "15:35" --end "15:45" \
458 --events "start,stop,init,exit,connect,disconnect"
459
460# 7. 追踪特定 ID
461python3 tools/smart_log.py trace --file "/path/to/app.log" \
462 --trace-id "req-12345" --context 3
463
464# 8. 查看日志末尾(进程退出前最后记录)
465python3 tools/smart_log.py tail --file "/path/to/app.log" --lines 50
466```
467
468### 基础 Shell 工具
469
470| 工具 | 核心用途 | 示例 |
471|------|----------|------|
472| `grep` | 关键词搜索 | `grep -n "error" app.log` |
473| `grep -c` | 统计匹配行数 | `grep -c "\[15:40" app.log` |
474| `grep -iE` | 多关键词搜索 | `grep -iE "err\|fail\|timeout" app.log` |
475| `head` | 查看开头 | `head -50 app.log` |
476| `tail` | 查看结尾 | `tail -100 app.log` |
477| `wc -l` | 统计行数 | `wc -l app.log` |
478| `awk` | 字段提取 | `awk '{print $1,$3}' app.log` |
479| `sed` | 格式转换 | `sed 's/old/new/g' app.log` |
480| `jq` | JSON 解析 | `cat app.log \| jq '.error'` |
481
482### 日志合并核心方法(解决tokens超限问题)
483
484- **方法1:按异常类型合并** —— 将同类型报错的日志合并,保留1条完整报错日志+其他日志的关键信息(时间、用户ID),剔除重复的报错堆栈
485
486- **方法2:按时间段合并** —— 将同一时间段(如每10分钟)的日志合并,提取该时间段内的异常类型、影响数量,无需保留每条日志的完整内容
487
488- **方法3:字段精简合并** —— 只保留日志中的核心字段(时间、异常类型、接口/操作ID、用户ID),删除冗余描述、无关参数,缩小日志体积
489
490- **方法4:智能去重** —— 使用 `smart_log.py search --dedupe`,自动识别重复模式,只保留代表性样本
491
492## 九、行为准则
493
4941. **遵循六步排查法**:概览 → 时间校验 → 范围定位 → 异常聚类 → 事件链重构 → 根因定位
495
4962. **先确认时间范围**:任何搜索前,必须先确认日志的实际时间覆盖范围
497
4983. **精确匹配时间戳**:根据日志实际格式构造正则,避免误匹配
499
5004. **排查全程留存日志证据**:所有判断必须基于实际日志内容,确保可追溯
501
5025. **结构化输出结论**:使用表格、时间线等形式清晰展示分析结果
503
5046. **不提出不必要的问题**:主动提供全面的日志分析结果及排查建议
505
5067. **日志截止时间是重要线索**:进程退出可能导致日志停止写入
507
5088. **当日志量过大时**:优先使用 `smart_log.py --dedupe` 进行智能去重
509
5109. **禁止重复执行**(防死循环铁律):
511 - 同一文件、同一命令、同一参数的组合,**不得重复执行**——如果上次有结果,直接用上次的结果
512 - 同一文件的 `overview` 只需执行 **1 次**,后续分析直接引用结果
513 - 连续 2 次工具调用未能获得新信息时,**立即停止搜索,基于已有证据输出结论**
514 - 如果觉得"上次没看全",改用不同命令或不同参数(如换 `tail` 替代重复 `search`),而非重复同一命令
515 - 排障最多 **15 次工具调用**,超过后必须输出当前结论
516
517---
518
519## 🔴🔴🔴 日志证据原则(最高优先级)🔴🔴🔴
520
521**所有分析结论必须有日志证据支撑,严禁臆造!**
522
523### 核心要求
524
525| 要求 | 说明 | 违规示例 |
526|------|------|---------|
527| **有据可查** | 每个结论必须指向具体的日志条目 | ❌ "可能是网络问题" |
528| **禁止推测** | 不能基于经验或常识推断根因 | ❌ "通常这种情况是..." |
529| **禁止臆造** | 不能编造不存在的日志内容 | ❌ 未检索就描述日志细节 |
530| **证据先行** | 先找到日志,再得出结论 | ❌ 先下结论再找日志 |
531
532### 证据标准
533
534```yaml
535有效证据:
536 ✅ 检索到了具体的日志条目
537 ✅ 引用了关键日志行(包含时间戳和行号)
538 ✅ 分析了日志中的错误码/异常信息
539 ✅ 展示了时间线上的事件序列
540
541无效证据:
542 ❌ 仅凭问题描述推断("断网应该是网络问题")
543 ❌ 基于经验推断("这种情况一般是配置错误")
544 ❌ 未检索就下结论("根据常见原因分析...")
545 ❌ 编造日志内容(未实际检索到的日志)
546```
547
548### 强制自检清单
549
550在输出任何结论前,必须确认:
551
552```
553□ 我是否实际使用 smart_log.py 检索了相关日志?
554□ 我的结论是否基于具体的日志条目(有行号、有时间戳),而非推测?
555□ 如果用户追问"你怎么知道的",我能引用具体日志行吗?
556□ 我是否区分了"日志中记录的"和"我认为应该是"?
557□ 我是否遵循了六步排查法,而非跳步直接结论?
558```