日志分析提示词(海量报错日志归类:高频模式、首次出现时间、影响范围与排查优先级)

线上告警后面对几千上万行日志无从下手、或想定期复盘错误趋势时用:把日志归并成「错误模板」,统计每类出现次数、首末时间和影响面,区分新出现的错误与长期噪音,并给出排查优先级;日志太大时生成本地聚合脚本,只把统计结果交给 AI。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
【角色】你是一名值班经验丰富的 SRE,擅长从大量日志里找规律:先归类、再看趋势、最后才看单条细节。

【背景】
- 系统与组件:[系统与组件]
- 日志格式说明(时间、级别、模块、trace_id 等字段在哪):[日志格式]
- 时间范围与关键事件(如几点发版、几点开始告警):[时间范围与事件]
- 用户反馈的现象:[故障现象]
- 日志内容(已脱敏;可以是原始日志,也可以是聚合后的统计结果):
  [粘贴日志]

【任务】
1. 归一化:把每行日志中的变量部分(数字、UUID、IP、用户 ID、时间戳、文件路径中的变化部分)替换成占位符,得到「错误模板」。
2. 模板统计表:模板 | 级别 | 次数 | 首次出现 | 最后出现 | 涉及的模块或实例 | 示例原文一条。
3. 趋势判断:哪些模板是在我给出的关键事件之后新出现或激增的;哪些是长期存在的背景噪音(说明判断依据)。
4. 关联分析:通过 trace_id、请求 ID 或时间相邻关系,找出可能的因果链,例如「数据库连接池耗尽」之后紧接着出现大量「接口超时」。
5. 排查优先级:按「与故障现象的相关性 × 影响面 × 是否新出现」排序,前 3 个各给出下一步排查动作(查看哪个指标、执行什么命令、看哪段代码)。
6. 如果我贴的是原始日志且超过几百行,给出一个本地运行的聚合脚本(Python,或 grep、awk 组合),让我在本地跑完后只贴统计结果。

【约束】
- 结论要能追溯到具体的日志行或统计数字,推测的因果关系标注「推测」。
- 不要因为某条错误次数多就认定它是根因,背景噪音往往次数最多。
- 发现日志里有未脱敏的密钥、手机号、身份证号等,提醒我轮换或清理,并在输出中打码。

【输出格式】
一句话结论 → 模板统计表(按优先级排序)→ 时间线 → 可能的因果链 → 下一步排查动作 → 聚合脚本(如需要)→ 日志改进建议(缺少的字段、级别使用不当的地方)。

高亮处换成你自己的内容:[系统与组件]、[日志格式]、[时间范围与事件]、[故障现象]、[粘贴日志]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[时间范围与事件] 是区分「新问题」和「老毛病」的关键,写清「14:05 发版,14:12 开始告警」,AI 才能做前后对比。日志量很大时不要硬贴,先让它生成聚合脚本,在本地跑出前 50 个模板的统计再贴回来,既省上下文,也避免把大量敏感数据交给外部服务。

和「程序报错怎么解决」提示词的区别:那条适合一个具体报错的深挖;这条适合面对大量日志时先找出「该深挖哪一个」。找到优先级最高的错误后,可以把它的完整堆栈交给那条提示词继续定位。

常见坑:日志中常带用户手机号、token、内网 IP,粘贴前先脱敏;不同实例的时区不一致会让时间线错乱,先确认都是同一时区。

追问技巧:对排名第一的模板追问「列出能证实或排除它是根因的 3 个证据」;复盘时说「根据这次的模式,建议增加哪些告警规则」。

示例输出

示例,仅供参考

结论:14:05 发版后新出现「连接池等待超时」模板(1,842 次),与接口超时告警的时间吻合,优先排查;「Redis 重连」每天都有,属背景噪音。

本地聚合脚本(节选):

python
import re
from collections import Counter

RULES = [
    (re.compile(r"\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b", re.I), "<UUID>"),
    (re.compile(r"\b\d{1,3}(?:\.\d{1,3}){3}\b"), "<IP>"),
    (re.compile(r"\d+"), "<N>"),
]

def to_template(message: str) -> str:
    for pattern, placeholder in RULES:   # 先替换长模式,再替换普通数字
        message = pattern.sub(placeholder, message)
    return message.strip()

counter = Counter()
with open("app.log", encoding="utf-8", errors="replace") as f:
    for line in f:
        if " ERROR " in line:
            # 假设每行前 3 段是 日期 时间 级别,其后是消息
            counter[to_template(line.split(" ", 3)[-1])] += 1

for template, count in counter.most_common(50):
    print(count, template)

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~