问一个日志不打印栈信息的问题

查看 50|回复 6
作者:ainyyy   
部分代码如下:
               
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResult.fail("系统异常");
        }
日志文件中显示
2025-11-07 09:43:23.128 [http-nio-20001-exec-934] ERROR StoreOrderServiceImpl:557 - null
java.lang.NullPointerException: null
然后就结束了, 最近出了好多这种问题.  打印空指针,但是完全没有栈相关信息

日志, 打印, 栈信息

mulychou   
问题在于:e.getMessage() 可能为 null 。
例如,在 NullPointerException 没有具体 message 时,e.getMessage() 返回 null 。于是日志输出时会变成:
null
java.lang.NullPointerException: null
此时虽然异常对象 e 传入了,但很多日志框架(例如 logback 或 log4j2 )在第一个参数是 null 时会只打印异常类型,而不打印堆栈。
直接使用占位符打印日志吧,例如:
log.error("Error occurred: {}", e.getMessage(), e);
Goooooos   
java 的 JIT 会优化掉一部分异常的堆栈,尤其是 NPE
启动参数加上-XX:-OmitStackTraceInFastThrow 可以禁用 fast throw 优化
JYii   
正常输出应该是先打印 exception 的 message ,然后紧跟堆栈信息,现在没有,那不就是如 1L 所说。而且 log.error 的第一个参数应是自定义的消息模板,不该直接放异常信息。
luoke99   
是不是由自己封装的异常类触发的,我们之前有个项目就是封装了一个 BizException,有个家伙把 fillInStackTrace() 重写了,导致 log 不会打印异常栈
Wh1te   
这是 JVM 的 OmitStackTraceInFastThrow 优化.RuntimeException 频繁出现,就会省略掉堆栈,比如 NullPointerException ClassCastException ArrayIndexOutOfBoundsException 等等.
你往前找到最开始出现这个异常的日志,那里就有堆栈信息
Need4more   
#2 、#5 正解  
jvm 针对高频异常会复用预分配实例以提升性能。若需完整堆栈,需显式禁用参数-XX:-OmitStackTraceInFastThrow
您需要登录后才可以回帖 登录 | 立即注册

返回顶部