项目启动失败体检 (ym-boot-failure-triage)
按日志特征把"起不来"归类,给出从最可能到最不可能的排查顺序和最小验证命令,而不是堆一堆可能原因让用户自己试。每条候选原因都给出支持证据、反驳证据和状态(已证实 / 待验证)。
何时使用
- 用户说「项目起不来」「启动报错」「起服务失败」「本地跑不起来」「boot failure」时
- 用户贴了启动日志、报错堆栈,问"这是什么问题、先查什么"时
- 新人搭环境卡在启动阶段,需要有序排错指引时
运行前提
- 依赖:无第三方依赖,纯日志分析
- 不读取用户机器、不连接远程、不修改任何代码或配置文件
- 不联网、不上传日志(日志可能含内网地址与账号,提示用户脱敏)
输入契约
| 项 | 必需 | 说明 |
|---|---|---|
| 启动日志 / 报错堆栈 | 必需 | 鼓励贴完整尾部 100~200 行,含 Caused by / 第一个 Error |
| 技术栈与版本 | 可选 | Spring Boot / Node / Python、JDK、框架版本、是否首次启动、最近改动 |
| 运行环境 | 可选 | Windows / Linux、容器、是否中间件独立部署 |
缺失处理:
- 缺技术栈 → 从日志特征反推(如看到
org.springframework判为 Spring Boot),并标注"推断" - 只有一句"启动失败"无日志 → 先给"如何拿到完整日志"的操作指引,不做原因分析
- 日志被截断在关键行之前(缺 Caused by)→ 明确说明需要哪一段,请用户补全
- 日志只有 INFO 无 ERROR → 说明未捕获到错误行,给出调高日志级别的方法
执行步骤
-
定位关键错误行 — 先找最内层
Caused by(Java)或第一个 Error(Node/Python),忽略其上的包装层与 INFO 噪音。找不到错误行 → 进入"缺失处理"的调高日志级别分支,不猜测。 -
归类候选原因 — 按
references/log-signature-map.md的对照表,把关键错误行映射到一个或多个候选原因。按本地经验出现频率排序(配置 → 端口 → 依赖 → 数据库 → 注入/循环依赖 → 文件权限 → 资源 → 中间件)。 -
填证据表 — 每个候选原因写三列:支持证据(从用户日志摘出的行)/ 反驳证据(日志里没有的迹象,或指向别的证据)/ 状态(有直证写"已证实",否则写"待验证")。状态为"已证实"的排在最前。
-
给有序排查步骤 — 每步写清"做什么 → 看到什么说明是这个问题 → 怎么修",步骤可执行。每步带最小验证命令(见 references 对照表的 Windows/Linux 命令)。
-
标人工验证 — 修复建议凡涉及改配置、改代码、重启服务的,标注"需你人工确认/验证后再上线",不下"一定修好"的断语。
-
补信息请求 — 若日志不足以定位,明确列出"再提供这三项就能进一步判断"(如完整 Caused by、application.yml、端口占用排查结果),不硬猜。
-
硬性约束核对 — 输出前确认:没改用户代码;没下"一定是 X"的断语;修复建议都标了是否需人工验证。
输出格式
套用 templates/triage-report-template.md,Markdown:
一、关键错误行(原文引用)
二、候选原因排序表(原因 | 可能性 | 支持证据 | 反驳证据 | 状态)
三、排查步骤(编号,可执行,每步带最小验证命令)
四、需要补充的信息
能力边界
- 不能远程连接用户机器,不能直接改配置文件
- 不保证覆盖所有框架;未见过的技术栈按通用规律推导并标注"推断"
- 给出的修复是方向性建议,落地需用户结合自己环境确认
常见坑
- 只看第一行报错 — 现象:对着
Exception in thread "main"猜了半天。原因:真正根因在最内层 Caused by。规避:第 1 步强制定位最内层,堆栈要读到尾。 - 把 INFO 当错误 — 现象:在大量 INFO 里乱找,给出错误方向。原因:没区分日志级别。规避:优先找 ERROR / Caused by / 第一个 Exception,INFO 仅作上下文。
- 端口占用误判为配置问题 — 现象:看到启动失败就让用户改配置。原因:没先验证端口是否真被占用。规避:先用
netstat/lsof查端口,证据确凿再定性。 - ClassNotFoundException 乱猜缺包 — 现象:直接让用户加依赖。原因:没区分"真缺包"还是"版本冲突导致类找不到"。规避:看是否伴随 NoSuchMethodError / 版本号,按需给
mvn dependency:tree/npm ls查冲突。 - 循环依赖当成普通注入失败 — 现象:给了"加 @Autowired"的错误建议。原因:没看
BeanCurrentlyInCreationException这类循环依赖特征。规避:对照表里有循环依赖专属关键字,命中即给"改构造注入/@Lazy"方向。 - Windows 中文路径/换行符漏掉 — 现象:在 Linux 跑得好好的,Windows 本地起不来。原因:没考虑路径编码、CRLF、证书位置。规避:文件权限与路径类单独列出 Windows 专属排查命令。
验收用例
- 正常:贴入
Port 8080 was already in use→ 判为端口占用,给查占用与释放命令,状态"已证实" - 边界 1:日志只有 INFO 无 ERROR → 说明未捕获错误行,给调高日志级别方法
- 边界 2:
ClassNotFoundException→ 判为依赖问题,给排查依赖树命令 - 失败:只说"起不来"无日志 → 给取日志指引,不做原因分析
目录说明
references/— 日志特征 → 候选原因对照表(含 Windows/Linux 排查命令)templates/— 启动失败体检报告模板(直接复制填充)scripts/— 已删除(本技能为纯文本分析,无需脚本)