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)
将异常栈信息打印出来就可以看到到底是那行代码出现了问题了。
参考文档
Java log 不打印异常栈信息
https://blog.yjll.blog/post/6b05ac2c.html