Java log 不打印异常栈信息

最近查线上问题时,发现了一个不打印异常栈信息的情况,仔细排查原来和JVM优化有关,log如下

2022-01-25 11:57:38,074 ERROR (AgentOutboundController.java:126)- null
java.lang.NullPointerException: null

查看日志时我以为代码中没有打印异常的详细信息,又查看了一遍代码

try {
    ...
} catch (Exception ex) {
    log.error(ex.getMessage(), ex);
    return new Result<>(ex);
}

发现代码写的没什么问题,那么问题出在哪?
原来JVM对一些特定的异常类型做了Fast Throw优化,如果检测到在代码里某个位置连续多次抛出同一类型异常的话,异常栈信息会被清空。

在启动时配置-XX:-OmitStackTraceInFastThrow参数,即可关闭此优化。

配置好参数重启服务,日志恢复了正常:

2022-01-25 12:53:37,167 ERROR (AgentOutboundController.java:126)- null
java.lang.NullPointerException: null
	at com.example.production.api.service.AgentOutboundService.lambda$addOutboundCode$0(AgentOutboundService.java:388)
	at java.util.ArrayList.forEach(ArrayList.java:1259)

将异常栈信息打印出来就可以看到到底是那行代码出现了问题了。

参考文档

JVM参数OmitStackTraceInFastThrow导致的异常栈信息不见了

OmitStackTraceInFastThrow与JVM的C1,C2编译器


Java log 不打印异常栈信息
https://blog.yjll.blog/post/6b05ac2c.html
作者
简斋
发布于
2022年1月26日
许可协议