AI会干活 / 免费教程
线上接口偶发 500,怎样让 Codex 帮你串起请求、日志和代码
线上接口偶发 500,最折磨人的地方往往不是“报错”本身,而是材料分散:报警里只有接口路径,用户反馈里只有时间点,日志里夹着几十条相邻请求,本地又复现不出来。后端工程师真正要做的,不是立刻让 AI 猜答案,而是先把请求样例、时间窗口、日志片段、异常堆栈和处理函数放到同一张排查图里。
适合人群
排查服务端问题的后端工程师
先解决什么
某个接口线上偶发 500,本地不一定复现。
学完结果
排查路径和最可能根因列表。
你会学到什么
让 Codex 对照请求参数、日志时间点、异常堆栈和处理函数。
准备材料:接口路径、请求样例、服务日志、相关代码、时间窗口。
交付物:排查路径和最可能根因列表。
边界:聚焦服务端接口异常链路。
教程定位
这篇教程解决什么问题
线上接口偶发 500,最折磨人的地方往往不是“报错”本身,而是材料分散:报警里只有接口路径,用户反馈里只有时间点,日志里夹着几十条相邻请求,本地又复现不出来。后端工程师真正要做的,不是立刻让 AI 猜答案,而是先把请求样例、时间窗口、日志片段、异常堆栈和处理函数放到同一张排查图里。
这篇文章讲一个通用工作流:当某个接口线上偶发 500 时,怎样让 AI/Codex 辅助梳理材料、对齐时间点、追踪调用链、列出最可能根因,并把下一步验证动作拆清楚。重点不是让 AI 替你下结论,也不是让它“自动修复线上问题”,而是让它帮你把混乱材料整理成可执行的排查路径。
最终你会得到一份可以用于排障群、工单或个人记录的排查结果:包括已知事实、关键日志、入口函数、可能根因排序、需要补充的证据、建议验证顺序、临时止血建议和代码修改关注点。这个产物的价值在于减少盲查,让你在第一次看日志和代码时就知道从哪里下手。
使用场景
什么情况下最适合用这一套
你是负责某个服务端接口的后端工程师。线上监控显示 `/api/orders/submit` 或类似接口在某个时间段出现少量 500。错误不是全量发生,只有部分用户、部分请求、部分时间点中招。你拉到几段日志,但日志里既有网关层请求记录,也有业务服务日志,还有数据库或下游服务异常。你知道要查调用链,但一时难以判断入口参数、异常堆栈和代码分支到底怎样连起来。
这个场景通常有几个共同特征。
第一,材料碎。报警平台、日志平台、链路追踪、用户反馈、接口代码、配置变更记录各在各处。单看一段堆栈,只能知道“哪里抛了异常”;单看请求参数,只能知道“传了什么”;单看代码,又不知道线上到底走到了哪条分支。
第二,本地不稳定复现。偶发 500 往往依赖真实数据、并发时序、下游状态、缓存内容、灰度配置或第三方返回值。本地构造一个“看起来差不多”的请求,可能永远走不到线上报错的条件。
第三,结论容易过早。很多人看到 `NullPointerException`、`TypeError`、`database timeout`、`Cannot read property` 就急着改一行代码。但线上 500 的根因可能在更上游:某个字段缺失只是表象,真正原因是调用方在新版本里改变了字段结构;数据库超时只是表象,真正原因是某个参数触发了没有索引的查询;空指针只是表象,真正原因是缓存击穿后兜底分支没有补齐默认值。
所以,本文的方法不是“让 AI 找 bug”,而是“让 AI/Codex 帮你把证据链串起来”。它适合服务端接口异常、业务处理函数较复杂、日志量较大、排查时需要在请求、日志和代码之间反复跳转的情况。
材料准备
开始前先把材料和边界备齐
开始之前,先把材料整理到一个临时文档或工单里。不要一上来把整个仓库、整天日志、几十个截图都扔给 AI。材料越乱,AI 越容易给出看似完整但无法验证的推断。你要先准备最小可用材料,再让 AI 帮你扩展排查范围。
建议准备五类材料。
第一类是接口信息。至少包含接口路径、HTTP 方法、业务含义、调用方、是否经过网关或 BFF、是否有灰度、是否有最近上线。比如:`POST /api/orders/submit`,用于提交订单,调用方包括小程序和后台客服代下单。
第二类是请求样例。优先选择真实失败请求的脱敏版本。如果拿不到完整请求,也要保留关键字段、请求头、用户或租户标识、订单或资源 ID、traceId、时间点。脱敏时要替换手机号、姓名、地址、token、密钥、身份证、银行卡等敏感数据,但不要把字段结构删到无法判断。
第三类是日志。至少包含失败时间点前后几分钟的相关日志,包括请求入口日志、业务处理日志、异常堆栈、下游调用日志、数据库慢查询或超时日志。不要只贴最后一行异常。偶发问题常常要靠异常前的一两条业务日志判断走到了哪条分支。
第四类是相关代码。不要一次贴整个项目。先贴入口路由、控制器或 handler、主要 service 函数、异常堆栈中出现的函数、关键参数转换或校验逻辑、下游调用封装。若代码很长,先保留函数签名、关键分支、错误处理和日志打印位置。
第五类是时间窗口和变化背景。比如:错误集中在 10:05 到 10:18;10:00 有一次发布;10:03 切过灰度;10:08 下游库存服务有告警;只影响某个租户;只有 iOS 新版本调用。AI 不知道这些背景,除非你明确给它。
你还需要确定一个边界:AI/Codex 辅助的是“梳理和定位路径”,不是替你确认真实线上根因。最终结论必须回到日志、监控、代码和复现实验里验证。特别是生产修复、数据修正、回滚、补偿任务、临时开关,都要由人判断和执行。
实操流程
按这套步骤把工作跑起来
【第一步:先让 AI 整理已知事实,不让它马上猜根因】
很多人第一次提问就写:“接口 500 了,帮我看看是什么原因。”这会诱导 AI 直接猜测。更稳妥的做法是让它先整理已知事实,把材料分成“确定”“推测”“缺失”三类。
你可以要求 AI 输出:
这一步的目标不是得到答案,而是把散落材料变成可检查的事实表。事实表越准确,后面的根因排序越可靠。
【第二步:用时间线把请求、日志和代码连起来】
偶发 500 的排查核心是时间线。你要知道请求从入口进来后,依次经过了哪些步骤,在哪一步出现异常,异常前是否有可疑分支。
让 AI 根据日志时间戳、traceId、函数名和代码位置,整理一条时间线。例如:
真实排查时,这条线可能不会这么完整。没关系,AI 的价值之一就是帮你标出断点:哪一段日志缺失,哪个函数没有打印关键字段,哪个下游调用没有 traceId,哪个异常被包装后丢了原始原因。
【第三步:把异常堆栈映射到处理函数和分支条件】
异常堆栈只能告诉你“报错位置”,不能自动告诉你“为什么走到这里”。让 AI/Codex 对照堆栈和代码,找出从入口到报错行的路径。
你可以让它回答:
这一步特别适合处理“看见异常但不理解上下文”的情况。比如堆栈显示某个字段为空,但代码里这个字段明明应该由上游校验保证存在。AI 可以帮你沿着字段来源往回找:控制器有没有校验,DTO 转换有没有默认值,调用方是否可能传空字符串,数据库查询是否可能返回空列表,下游服务失败时是否返回了空对象。
【第四步:让 AI 给出根因候选,但必须按证据排序】
当事实、时间线、代码分支都整理完,再让 AI 输出根因候选。要求它不要只写“可能是参数问题”“可能是数据库问题”这种泛泛判断,而要按证据强弱排序。
一个好的根因候选应该包含四部分:
这种格式能防止 AI 把推测包装成结论,也方便你跟同事沟通。排障不是比谁猜得快,而是比谁更快把假设变成可验证动作。
【第五步:拆成止血、验证、修复三个层次】
线上 500 不一定能等到完整根因确认后再处理。你可以让 AI 帮你把动作拆成三个层次。
止血动作关注“先降低影响”:是否需要回滚最近发布、关闭灰度、降级某个功能、临时拦截异常请求、恢复下游服务、扩大重试间隔、临时禁用某个可选优惠逻辑。但止血动作要谨慎,AI 只能列出候选,不能替你判断是否执行。
验证动作关注“证明根因”:补充日志、按 traceId 抽样、复现请求、查询数据库状态、比对失败和成功请求差异、检查最近配置变更、查看下游服务状态、构造单元测试或集成测试。
修复动作关注“消除问题”:完善参数校验、补充空值处理、修正状态机分支、优化慢查询、调整超时时间、修复异常包装、补齐幂等保护、增加监控告警。修复前要回到代码评审和测试,不要直接照抄 AI 给出的补丁。
【第六步:把排查结论写成可交接记录】
接口 500 的排查常常跨人协作。你今天查到一半,可能需要交给值班同事;你在排障群里说了一堆,事后又要补复盘。让 AI 帮你把结论整理成记录,可以减少遗漏。
建议记录包括:
这份记录也能反过来校验 AI 的输出:如果它写不出清楚的“证据”和“下一步”,说明前面的材料还不够。
- 10:12:31.204 网关收到 `POST /api/orders/submit`。
- 10:12:31.238 订单服务进入 `submitOrder`。
- 10:12:31.261 参数转换后 `couponId=null`。
- 10:12:31.312 调用库存服务成功。
- 10:12:31.441 查询优惠券失败或返回空。
- 10:12:31.449 在 `calculateDiscount` 中读取空对象字段,抛出异常。
- 失败接口和时间窗口;
- 失败请求的关键字段;
- 日志中出现的 traceId、requestId、userId、orderId 等关联字段;
- 异常类型和堆栈位置;
- 堆栈对应到的代码函数;
- 尚缺哪些材料。
- 报错行读取了哪些变量;
- 这些变量从哪里来;
- 哪些分支会让变量为空、格式异常、超出范围或状态不一致;
- 哪些请求字段会影响这些分支;
- 哪些外部返回值会影响这些分支;
- 代码是否有兜底、重试、空值处理、异常转换;
- 日志里是否能证明实际走了某个分支。
- 根因假设:例如“失败请求缺少 couponId,但代码在某个分支仍然尝试读取 coupon 对象字段”;
- 支持证据:例如“日志中失败请求的 couponId 为空,堆栈报错行在 calculateDiscount,代码未对 coupon 查询结果判空”;
- 反证或不确定点:例如“目前只有一条失败请求样例,不能证明所有 500 都由该字段触发”;
- 下一步验证:例如“按 traceId 再抽取 10 条失败请求,统计 couponId 缺失比例;本地构造同类请求;补充报错行前的字段日志”。
- 问题概述:哪个接口、什么时间、影响范围;
- 已确认事实:请求、日志、堆栈、代码位置;
- 当前最可能根因:按证据排序;
- 已排除方向:例如不是全量发布失败,不是网关超时,不是所有用户;
- 正在验证的方向:需要谁提供什么数据;
- 临时措施:是否已回滚、降级、加日志;
- 待修复点:代码、测试、监控、文档;
- 风险提醒:哪些结论还只是推测。
输入示例
可以直接参考的输入材料
下面是一个经过脱敏和压缩的输入样例。真实使用时,你可以把接口路径、请求、日志、堆栈和代码分别贴到同一个提示词里。注意,这只是示例,不代表某个具体框架或平台的实际行为。
这个样例里,真正有用的信息不是“500”两个字,而是 `traceId`、时间点、请求字段、日志中的 `normalized couponId=null`、堆栈位置和代码中 `coupon.discountType` 的读取。这些信息被放在一起后,AI 才能做可靠梳理。
背景:
- 线上接口 POST /api/orders/submit 偶发 500。
- 时间窗口:2026-07-04 10:05 到 10:18。
- 只影响部分提交订单请求,本地暂未稳定复现。
- 10:00 有一次普通业务发布,改动包含优惠券计算逻辑。
失败请求样例,已脱敏:
traceId: trc_7f2a_demo
method: POST
path: /api/orders/submit
headers:
x-client-version: app-3.8.1
body:
userId: user_demo_001
skuId: sku_demo_8848
quantity: 1
couponId: ""
addressId: addr_demo_023
相关日志:
2026-07-04 10:12:31.238 INFO traceId=trc_7f2a_demo enter submitOrder userId=user_demo_001 skuId=sku_demo_8848
2026-07-04 10:12:31.261 INFO traceId=trc_7f2a_demo normalized couponId=null
2026-07-04 10:12:31.312 INFO traceId=trc_7f2a_demo stock reserved skuId=sku_demo_8848
2026-07-04 10:12:31.441 WARN traceId=trc_7f2a_demo coupon lookup skipped reason=empty_coupon_id
2026-07-04 10:12:31.449 ERROR traceId=trc_7f2a_demo submit order failed
java.lang.NullPointerException: Cannot read field "discountType" because "coupon" is null
at OrderPriceService.calculateDiscount(OrderPriceService.java:86)
at OrderService.submitOrder(OrderService.java:142)
at OrderController.submit(OrderController.java:47)
相关代码片段:
OrderController.submit(request):
return orderService.submitOrder(request)
OrderService.submitOrder(request):
normalized = normalizeRequest(request)
reserveStock(normalized.skuId, normalized.quantity)
coupon = couponService.findCoupon(normalized.couponId)
price = priceService.calculateDiscount(normalized, coupon)
return createOrder(normalized, price)
OrderPriceService.calculateDiscount(order, coupon):
if order.quantity <= 0:
throw BadRequest("invalid quantity")
if coupon.discountType == "PERCENT":
return order.basePrice * coupon.value
return order.basePrice - coupon.value
希望产出:
- 排查路径
- 最可能根因列表
- 还需要补充哪些证据
- 建议先验证什么提示词
可复制使用的提示词
你可以直接复制下面的提示词,把方括号里的内容换成你的真实材料。为了安全,粘贴前请先脱敏,不要包含 token、密钥、手机号、身份证、银行卡、完整地址、真实客户姓名等敏感信息。
如果你在本地使用 Codex 辅助阅读代码,可以把“相关代码”部分拆得更细:先给入口函数和堆栈函数,让它整理字段流向;再补充配置、调用方或测试用例,让它更新根因候选。不要一口气把无关模块全贴进去,否则输出会变得散。
你是一个服务端接口排查助手。请不要直接下最终结论,先帮我把请求、日志、异常堆栈和代码串成可验证的排查路径。
问题背景:
[写清接口路径、HTTP 方法、业务场景、时间窗口、影响范围、最近是否发布或改配置]
失败请求样例,已脱敏:
[粘贴一个或多个失败请求,保留 traceId/requestId、关键 headers、关键 body 字段]
相关日志:
[粘贴失败时间点前后的入口日志、业务日志、下游调用日志、异常堆栈]
相关代码:
[粘贴入口 handler/controller、主要 service、异常堆栈涉及函数、关键校验和异常处理逻辑]
请按以下格式输出:
1. 已知事实表:只写材料里能直接支持的事实,不要猜。
2. 时间线:按时间戳和调用顺序串起请求、日志和函数。
3. 堆栈到代码映射:指出异常发生在哪个函数、哪一类变量或分支上。
4. 最可能根因候选:按可能性排序,每个候选都要写支持证据、反证或不确定点、下一步验证动作。
5. 需要补充的材料:列出为了确认根因还缺哪些日志、请求样例、监控或代码。
6. 止血、验证、修复建议:分开写。止血建议只作为候选,不要替我决定执行。
7. 风险提醒:哪些判断不能仅凭当前材料确认。
限制:
- 不要编造日志里没有出现的字段。
- 不要假设我使用某个具体云服务、框架版本或产品功能。
- 不要给出需要直接上线的补丁,除非明确标注为“待人工评审的示例思路”。
- 如果材料不足,请优先指出缺口,而不是硬猜。输出样例
AI 应该输出到什么程度
下面是一份使用上面输入后,可能得到的 AI 输出样例。注意,这只是排查草稿,不是最终事故结论。你需要继续用真实日志、复现和代码评审确认。
这类输出的重点是“证据链”。它没有把所有 500 都归因到空优惠券,也没有宣称发布一定有问题,而是告诉你最值得优先验证的方向。
1. 已知事实表
- 失败接口是 POST /api/orders/submit。
- 失败请求 traceId 为 trc_7f2a_demo,发生在 2026-07-04 10:12:31 左右。
- 请求 body 中 couponId 是空字符串。
- 日志显示 normalize 后 couponId=null。
- 日志显示库存预留成功,说明请求至少执行到了 reserveStock 之后。
- 日志显示 coupon lookup skipped,原因是 empty_coupon_id。
- 异常是 NullPointerException,发生在 OrderPriceService.calculateDiscount。
- 堆栈显示调用链为 OrderController.submit -> OrderService.submitOrder -> OrderPriceService.calculateDiscount。
- 代码中 calculateDiscount 直接读取 coupon.discountType,没有看到 coupon 为空时的处理。
2. 时间线
- 10:12:31.238:进入 submitOrder,带 userId 和 skuId。
- 10:12:31.261:请求被 normalize,couponId 从空字符串变成 null。
- 10:12:31.312:库存预留成功。
- 10:12:31.441:优惠券查询被跳过,原因是 couponId 为空。
- 10:12:31.449:提交订单失败,抛出 NullPointerException。
3. 最可能根因候选
候选 A:空 couponId 请求在优惠券查询阶段被跳过,但后续 calculateDiscount 仍按有 coupon 的路径读取字段。
支持证据:请求 couponId 为空;normalize 后 couponId=null;日志显示 coupon lookup skipped;代码中 calculateDiscount 未对 coupon 判空;堆栈正好指向 coupon.discountType。
不确定点:目前只有一条失败请求样例,还不能证明所有 500 都是这个原因。
验证动作:抽取同时间窗口内更多失败 traceId,统计 couponId 为空或 coupon lookup skipped 的比例;本地构造 couponId="" 的请求;补充 calculateDiscount 入口日志记录 coupon 是否为空。
候选 B:10:00 发布的优惠券计算逻辑改变了空优惠券的处理路径。
支持证据:错误时间窗口在发布后;改动范围包含优惠券计算逻辑;堆栈发生在 calculateDiscount。
不确定点:材料中没有发布 diff,无法确认旧逻辑是否允许 coupon 为空。
验证动作:查看本次发布 diff;比对发布前后 calculateDiscount 对空 coupon 的处理;检查是否有对应单元测试。
候选 C:调用方传入空字符串 couponId,但接口契约没有明确区分“不使用优惠券”和“优惠券字段缺失”。
支持证据:请求中 couponId="";normalize 后变为 null;后续逻辑对 null 语义处理不一致。
不确定点:当前材料没有接口文档和调用方代码,不能确认调用方是否违规。
验证动作:查看接口契约;比对成功请求中 couponId 的形态;和调用方确认空字符串是否是预期输入。
4. 建议先验证
优先验证候选 A,因为它同时被请求、日志、堆栈和代码支持。不要先改数据库或下游库存逻辑,因为当前材料没有显示库存失败。人工验收
人要怎么检查和改到可用
AI 输出后,后端工程师要做的第一件事是查事实是否被改写。比如日志里写的是 `coupon lookup skipped`,AI 却扩展成“优惠券服务返回空对象”,这就是过度推断。跳过查询和返回空对象不是一回事,分别指向不同代码路径。你要把这类表述改回材料能支持的事实。
第二件事是检查时间线是否真的成立。很多日志平台按采集时间排序,而不是按服务内时间排序;多实例、多线程、异步任务也可能让时间线看起来交叉。AI 整理出的顺序只能作为初稿,你要用 traceId、spanId、线程名、实例名和业务 ID 进一步确认。如果没有这些字段,就在“缺失材料”里标出来。
第三件事是检查根因候选是否混淆了表象和根因。异常行是 `coupon.discountType`,但根因不一定只是“没有判空”。更深一层的问题可能是接口契约没有定义空优惠券语义,或者发布改动破坏了“不使用优惠券”的路径。修复时也不能只加一个空判断了事,要确认业务上空优惠券应该走原价、报参数错误、还是忽略优惠逻辑。
第四件事是补充成功样本。只看失败请求容易误判。你需要找同一时间窗口内的成功请求,比较字段差异、用户差异、租户差异、客户端版本差异、下游返回差异。比如失败请求都是 `app-3.8.1`,成功请求都是 `app-3.7.x`,那调用方版本可能更关键。又比如失败只集中在某个租户,那可能和租户配置有关。
第五件事是补充变更背景。偶发 500 常常跟最近发布、配置切换、数据迁移、定时任务、流量放大、缓存失效有关。AI 不会自动知道这些。你要把发布记录、配置变更、监控告警和下游状态补进去,再让它重新排序根因候选。补充背景后,原本排第一的“参数为空”可能变成排第二,真正排第一的是“新发布把空优惠券路径从跳过计算改成进入计算”。
第六件事是把建议动作改成可执行任务。AI 可能写“检查日志”“增加测试”“查看下游服务”,这些太泛。你要改成:
第七件事是判断临时措施的风险。比如 AI 建议“空 coupon 直接按无优惠处理”,这在某些业务里是合理的,在另一些业务里可能绕过风控或促销规则。所有止血动作都要有业务 owner 或值班负责人确认。AI 可以帮你列选项,不能替你承担生产判断。
第八件事是把结论写成可以复盘的语言。不要只写“已修复 NPE”。更好的记录是:“部分订单提交请求在 couponId 为空字符串时,normalize 后得到 null;发布后的优惠券计算逻辑仍进入读取 coupon.discountType 的路径,导致空对象异常。已通过失败 traceId 和本地构造请求确认;修复为明确区分无优惠券路径,并补充空 coupon 场景测试。”这样的结论既能复盘,也能防止同类问题再次出现。
- 在日志平台按 `traceId` 查询 10:05 到 10:18 的失败请求,导出 couponId、clientVersion、tenantId;
- 构造 `couponId=""`、不传 `couponId`、传无效 `couponId` 三个请求,分别验证返回;
- 查看 10:00 发布 diff 中 `OrderPriceService.calculateDiscount` 的变动;
- 为“不使用优惠券”的订单补充单元测试;
- 在 `calculateDiscount` 入口补充脱敏日志,记录是否存在 coupon 和 couponId 原始形态。
失败反例
这些失败反例要提前避开
反例一:只把异常堆栈粘给 AI,让它直接猜。
很多人会贴一段堆栈,然后问“这是什么问题”。AI 可能会回答“空指针”“参数为空”“对象未初始化”,这些都只是异常类型解释,不是线上根因。没有请求字段、时间窗口、入口日志和代码上下文,就无法判断为什么对象为空,也无法判断是不是所有失败都来自同一原因。
反例二:把整天日志一次性塞进去,不做筛选。
日志越多不代表越可靠。没有 traceId、时间窗口和接口路径约束,AI 会在大量无关日志中寻找“看起来像错误”的片段,最后输出一个很长但不聚焦的列表。正确做法是先按接口、时间窗口、traceId 或业务 ID 收敛,再逐步补充相邻日志。
反例三:让 AI 直接生成补丁,并把补丁当成最终修复。
AI 看到空指针,可能会建议加判空;看到超时,可能会建议加重试;看到参数缺失,可能会建议加默认值。这些建议都有可能掩盖真实业务问题。生产修复必须经过业务语义确认、测试和代码评审。比如空优惠券是否应该按无优惠处理,不是技术助手能直接决定的。
反例四:忽略成功请求,只分析失败请求。
只看失败样本,容易把“失败请求共有字段”误当成根因。比如失败请求都来自某个客户端版本,但同版本也有大量成功请求;失败请求都传了某个字段,但成功请求也传了。你需要对比成功和失败样本的差异,而不是只在失败样本里找共同点。
反例五:把日志里的推测写成事实。
有些日志文案本身就是开发者写的推测,例如 `maybe coupon invalid`、`fallback user config`、`unknown downstream error`。AI 可能会把这些词当成确定结论。人工检查时要区分“日志事实”和“日志文案里的猜测”。真正的事实是时间、字段、状态码、异常类型、函数位置、返回值,而不是一句模糊描述。
反例六:没有保留排查记录,修完就结束。
偶发 500 修复后,如果没有记录输入材料、验证过程和排除方向,下次同类问题还会从零开始。尤其是跨团队接口,排查记录能帮助调用方理解接口契约,也能帮助值班同事知道哪些字段必须在日志中保留。
主题边界
它和相邻主题的区别
这篇文章聚焦“服务端接口异常链路”的通用排查工作流,核心材料是接口路径、请求样例、日志时间点、异常堆栈和处理函数。它解决的是:线上某个接口偶发 500,本地不一定复现时,怎样让 AI/Codex 辅助把证据链串起来,形成排查路径和根因候选。
它不是一篇“如何写单元测试”的文章。虽然文中会提到用测试验证修复,但重点不在测试框架、覆盖率或测试用例设计,而在故障发生后怎样从线上材料回推到代码路径。
它也不是一篇“如何优化接口性能”的文章。接口 500 可能与超时有关,但本文不展开性能压测、慢查询优化、缓存策略和容量规划,只讨论异常排查时如何组织证据。
它也不是一篇“如何使用某个具体 Codex 功能”的产品教程。本文不会声称 Codex 当前具有某个具体版本能力、价格或平台特性,只把 AI/Codex 当作辅助阅读材料、梳理路径和生成排查记录的工具。无论你是在编辑器里阅读代码,还是在对话窗口里整理日志,都可以沿用这个方法。
它还不同于“线上事故复盘模板”。复盘关注事故结束后的影响范围、根因、改进项和责任闭环;本文关注排查进行中的第一轮定位:如何把分散材料变成可验证假设。排查记录可以成为复盘材料,但两者不是同一个产物。
最后,它也不是“让 AI 代替值班工程师”的流程。线上 500 的止血、回滚、数据修复和发布决策仍然必须由人负责。AI/Codex 的合适位置,是帮你减少材料整理成本、暴露缺失证据、避免漏看分支,并把下一步验证动作写清楚。真正的结论,仍然要由日志、监控、代码、复现和人工判断共同支撑。
可直接套用的流程
1. 先写清楚任务目标:这次要让 AI 帮你完成什么工作,而不是泛泛地问一个问题。
2. 再给资料边界:哪些背景、数据、约束、口径必须被使用,哪些内容不能编。
3. 最后规定输出格式:用清单、表格、方案、话术还是复盘报告,并保留人工检查。