logger.error("create order failed, orderNo={}", orderNo, e);
<pattern>%d{HH:mm:ss} %-5level %msg%n%throwable</pattern>

线上报 NullPointerException,日志里只有 10 行 at 就断了,真正的 Caused by 一行都没有,排了两小时才在另一个文件里找到。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,日志组件配置了 maxDepth 或 abbreviated 模式,超出深度的栈帧被省略。框架又把异常包了一层,外层堆栈占满额度,根因被挤掉。

这次卡住的地方就在「异常堆栈截断」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

处理上按这个顺序:关掉堆栈深度限制 或把 maxDepth 调到 100 以上;打印时用 getCause 逐层输出 不要只打外层;保留完整 throwable 格式 不要自定义成一行;确认日志采集端没有按行数截断。

改完只确认一件事:再触发一次异常 日志里能看到完整调用链和 Caused by。

作者 9823189