用 Gemini 3.5 Flash 做日志归因:一次“告警很多但线索很散”的排查复盘

用 Gemini 3.5 Flash 做日志归因:一次“告警很多但线索很散”的排查复盘 文摘摘要本文复盘了一次支付回调服务 P95 延迟告警的排查过程记录如何用 Gemini 3.5 Flash 辅助整理脱敏日志、监控摘要、测试报告和发布记录。文章重点介绍日志切片、Prompt 约束、时间线生成、可疑原因排序、证据与反证区分、复盘初稿生成等流程并强调 AI 只适合做线索归纳和排查辅助根因确认仍需依赖人工验证、SQL 执行计划、代码 Diff、监控数据和团队评审。上周有个比较典型的线上问题支付回调服务在 20 分钟内连续触发 P95 延迟告警监控面板上看得到抖动但没有直接宕机应用日志、Nginx 日志、MQ 消费延迟、数据库慢查询、测试环境回归报告散在几个地方。以前遇到这种情况我一般是手动 grep、拼时间线、再找研发和测试对齐过程不复杂但很耗人。这次我尝试把 Gemini 3.5 Flash 放进排查流程里。为了减少不同模型之间来回切换的成本我把同一批脱敏日志放在一个多模型聚合环境里观察过测试环境是https://ouai.me它可以在同一界面切换 ChatGPT、Claude、Gemini、Grok 等模型比较适合同题复跑、文档整理、代码分析和任务拆解。这篇不是模型排行榜也不是说 AI 能代替 SRE 或后端排障。我的结论更克制一点Gemini 3.5 Flash 适合做“快速归纳 时间线整理 可疑点排序”但最终判断仍然要回到监控数据、代码变更、压测结果和人工 Review。问题场景告警很多但没人能马上说清主因这次异常发生在一个 Java / Spring Boot 服务上链路大致是支付网关 - Nginx - payment-callback-service - Kafka - order-service - MySQL告警现象包括payment-callback-serviceP95 延迟从 180ms 涨到 1.8sKafka 某个 topic 出现短暂堆积MySQL 有几条慢查询但不是持续性爆发Nginx 502 很少不像服务整体不可用最近一次上线改过回调幂等逻辑测试环境没有复现但回归报告里有一条“重复回调场景耗时增加”。这类问题麻烦在于每个单点都像原因又都不像最终原因。人工排查时大家很容易围绕自己熟悉的领域下判断后端怀疑数据库测试怀疑幂等逻辑运维怀疑 Kafka产品只关心订单状态有没有错。所以我把 AI 的任务定义得很窄不要让它给最终结论只让它帮我整理线索。核心模块一先做日志脱敏和切片不要整包丢给模型生产日志不能直接交给 AI。即使只是内部辅助分析也要先做脱敏和裁剪。我保留的信息只有这些保留字段用途时间戳拼接异常时间线traceId 哈希后片段关联同一请求链路服务名判断异常发生位置接口名抽象值区分回调、查询、补偿任务状态码判断失败类型耗时区间分析延迟变化异常类型判断错误类别Kafka lag 区间判断消息堆积影响我会移除或替换用户手机号、邮箱、姓名真实订单号、支付流水号商户号、渠道号内部 IP、机器名数据库连接串完整 token、签名、密钥真实网关地址和供应商名称。脱敏后日志片段大概长这样2026-xx-xx 10:12:03.231 servicepayment-callback tracet_8f31 apicallback_pay status200 cost186ms msgreceived callback 2026-xx-xx 10:12:04.018 servicepayment-callback tracet_8f31 apicallback_pay status200 cost1680ms msgidempotent_check slow 2026-xx-xx 10:12:04.552 servicepayment-callback tracet_8f31 eventkafka_send topicpay_callback cost320ms 2026-xx-xx 10:12:05.102 serviceorder-service tracet_8f31 eventconsume_callback cost220ms这里有个经验不要一次性把几万行日志都丢进去。更稳的方式是按时间窗口切片例如异常前 10 分钟告警开始后 10 分钟告警高峰期 10 分钟告警恢复后 10 分钟。然后让模型只比较这些窗口里的差异。核心模块二给 Gemini 3.5 Flash 的 Prompt 要限制角色和输出格式第一次我问得比较随意帮我分析这批日志找出线上延迟升高的原因。结果输出看起来很完整但有不少“经验性推测”比如直接说数据库连接池耗尽、Kafka broker 异常。这些在日志里并没有明确证据。后来我改成下面这种 Prompt你是一个 SRE 辅助分析助手。 请根据下面脱敏后的日志、监控摘要和测试报告片段整理“可疑原因清单”。 要求 1. 不要给最终结论 2. 只基于输入材料分析不要补充材料中没有的系统信息 3. 把“有证据支持”和“只是推测”分开 4. 按时间线整理异常出现顺序 5. 输出 JSON字段包括 - timeline关键事件时间线 - evidence有证据支持的现象 - suspects可疑原因包含置信度、证据、反证、需要人工确认的数据 - missing_info还缺哪些信息 - next_checks建议人工下一步检查项这类 Prompt 的重点不是“写得复杂”而是把模型限制在辅助分析范围里。尤其是不要最终结论区分证据和推测要求反证要求缺失信息输出结构化结果。Gemini 3.5 Flash 在这种结构化整理上响应很快适合反复调整输入窗口和 Prompt。它不一定每次都给出最深的根因分析但能快速把散乱线索压成一份可讨论的清单。核心模块三让模型先排“嫌疑顺序”再人工验证模型给出的可疑原因清单我不会直接接受而是转成排查表。示例输出整理后大致如下可疑原因证据反证人工检查幂等检查耗时上升多条日志出现idempotent_check slow时间与告警吻合不是所有请求都慢查幂等表索引、SQL 执行计划Kafka 发送耗时增加部分 trace 中 kafka_send 从几十 ms 到 300mslag 是短暂堆积不是持续恶化查 broker 指标、网络抖动MySQL 慢查询影响回调告警窗口有慢查询慢查询量不高查慢 SQL 是否与幂等逻辑相关下游 order-service 消费变慢消费耗时略升回调服务延迟先出现确认是否因上游堆积传导Nginx 层问题有少量 502数量太少仅作为边缘检查项真正推进排障的是这张表而不是 AI 的自然语言解释。最后我们人工确认的结果是上线后幂等检查逻辑新增了一个组合条件但索引没有覆盖高峰期重复回调增加后幂等查询耗时被放大导致回调服务处理时间上升并进一步带来 Kafka 短暂堆积。也就是说Kafka 和慢查询都出现了但主线还是幂等查询路径。这正好说明 AI 在排障中的位置它帮你缩小搜索范围但不能替你跑 SQL、看执行计划、回滚验证。辅助模块一把测试报告也喂进去能少走弯路这次有个关键线索来自测试环境回归报告重复支付回调场景 预期第二次回调命中幂等逻辑快速返回 结果接口返回成功但耗时从 120ms 上升到 650ms 备注测试环境数据量较小未判定为阻塞问题单看这条记录可能不会引起足够重视。但和生产日志合在一起看它就变成了非常重要的证据。我会用这样的 Prompt 让模型对齐测试报告和生产现象请比较“生产异常日志”和“测试回归报告”之间是否存在相互印证的线索。 要求 1. 找出相同接口、相同逻辑路径、相同异常现象 2. 不要把测试环境现象直接等同于生产原因 3. 标出哪些测试用例需要补充数据量、并发量或边界条件 4. 输出为表格。得到的表格通常对测试同事也有帮助生产现象测试报告线索是否印证需要补测幂等检查耗时上升重复回调场景耗时增加部分印证大数据量幂等表Kafka 短暂堆积测试未覆盖消息堆积不足并发回调 消费延迟慢查询出现测试环境数据量较小不足导入接近生产规模数据这个动作不复杂但能把“测试环境没复现”改成“测试环境没覆盖足够条件”讨论质量会高很多。辅助模块二让 AI 生成复盘初稿但必须保留证据链事故复盘文档最怕两种情况一种是写成流水账另一种是写成甩锅材料。AI 可以帮助起草但一定要要求它基于证据链。Prompt 示例请根据下面的时间线、排查记录和最终人工确认结果生成一份故障复盘初稿。 结构 1. 影响范围 2. 时间线 3. 直接原因 4. 触发条件 5. 为什么测试阶段未发现 6. 修复动作 7. 长期改进项 要求 - 不要夸大影响 - 不要归因到个人 - 每个结论都要对应证据 - 对不确定内容标记“需进一步确认”。生成后我会重点检查时间是否准确影响范围有没有被夸大根因是否和人工确认一致是否把推测写成事实改进项是否可执行。比如“加强测试”这种话没意义应该改成为重复回调幂等场景增加大数据量压测用例 上线前检查涉及高频查询路径的索引覆盖情况 将 idempotent_check cost 纳入业务埋点监控。辅助模块三成本敏感时把任务拆给不同模型或不同轮次Gemini 3.5 Flash 的优势之一是响应速度较快适合做多轮摘要、分类、结构化提取。但复杂根因分析不能只靠模型速度。我的实际流程会拆成几轮日志清洗脚本完成不交给模型窗口摘要让 Gemini 3.5 Flash 快速归纳每个时间段时间线拼接继续用同一模型输出结构化 JSON可疑点排序让模型列证据、反证和缺失信息人工验证查监控、SQL、代码 diff、发布记录复盘初稿模型生成人工改写最终评审研发、测试、SRE 一起确认。如果是特别复杂的事故我会把结构化结果再交给其他模型做一次“挑错”但不会搞成模型投票。不同模型的价值在于发现遗漏而不是替团队做最终判断。一个可复用的 Gemini 3.5 Flash 排障 Prompt 模板下面这个模板可以直接改你是一个线上问题排查助手任务是帮助整理线索而不是给最终结论。 输入材料包括 - 脱敏应用日志 - 监控摘要 - 测试报告片段 - 最近变更记录 请输出 1. 异常时间线 2. 与告警时间吻合的现象 3. 可疑原因清单按优先级排序 4. 每个可疑原因的证据、反证、置信度 5. 需要人工继续确认的数据 6. 建议下一步排查动作。 限制 - 不要编造日志中没有的服务、接口、数据库表 - 不要把推测写成事实 - 如果证据不足明确写“证据不足” - 输出 Markdown 表格 - 最后给出 5 条以内的人工检查建议。如果你希望结果更容易被程序处理可以把输出改成 JSON{timeline:[],confirmed_observations:[],suspects:[{name:,confidence:,evidence:[],counter_evidence:[],manual_checks:[]}],missing_info:[],next_actions:[]}结构化输出的好处是后续可以沉淀到故障复盘系统、知识库或工单里。验收标准怎么判断 AI 分析有没有用我给这类 AI 输出设了几个简单标准验收项合格标准时间线能覆盖告警前、告警中、恢复后三个阶段证据区分明确区分事实、推测和缺失信息可疑点排序排名前几项能对应真实日志或监控反证意识不只列原因也列为什么可能不是可执行性下一步检查能落到 SQL、监控、代码 diff 或压测安全性不包含敏感数据、真实客户信息和内部密钥可复核性人工能根据输出回到原始材料核对如果 AI 输出只是“可能是数据库、网络、缓存、队列问题”那价值很低。真正有用的输出应该能告诉你为什么怀疑它、证据在哪、还缺什么、下一步查哪张图或哪段代码。常见误区1. 直接把生产日志原样贴给模型不建议。日志里很容易带出用户信息、内部地址、token、订单号、商户信息。先脱敏再抽样再分析。2. 让 AI 直接判断根因AI 可以辅助归因但根因必须由人工结合监控、代码、配置、发布记录确认。尤其是线上事故复盘文档不能只引用模型输出。3. 忽略测试报告里的“小异常”测试环境没复现不代表线索没价值。低数据量、低并发下的轻微耗时增加放到生产高峰可能会被放大。4. Prompt 写得越长越好不一定。排障类 Prompt 最重要的是约束边界不编造、不下最终结论、区分证据和推测、输出可验证检查项。风险边界和团队落地建议在公司内部落地这类流程时建议先从低风险场景开始例如历史事故复盘脱敏后的测试日志分析压测报告整理非敏感告警摘要研发自测阶段的异常归类。不要一开始就把实时生产全量日志、客户数据、合同信息、金融交易明细、医疗记录等内容交给 AI。涉及金融、医疗、政务、教育等场景时AI 只能作为辅助整理工具不能替代专业人员做最终判断。对研发团队来说比较稳的落地方式是用脚本完成日志清洗和脱敏用 Gemini 3.5 Flash 做快速摘要和可疑点整理用固定模板要求模型输出证据、反证和缺失信息人工验证 SQL、监控、代码 diff 和配置把确认后的结论沉淀到复盘文档和测试用例中。结尾把 AI 放在“整理线索”的位置上这次排障后我对 Gemini 3.5 Flash 的定位更明确了它不适合被当成线上事故的裁判但适合当一个不知疲倦的日志整理助手。尤其在日志、监控、测试报告、发布记录分散的时候它能快速帮你拼出时间线把可疑点按证据强弱排出来。如果你是后端开发、测试工程师或 SRE建议先选一个历史问题做离线实验准备一批脱敏日志写清楚输出格式让模型只做线索整理再对照真实复盘看它漏了什么、猜错了什么。这样比直接把它接进生产流程稳得多。AI 能提高排查效率但线上质量最终还是靠监控、测试、代码审查、发布流程和人的责任心。把边界划清楚它才更像一个可靠的工程助手而不是另一个需要排查的不确定因素。