浅谈log4j不打印异常堆栈
本⽂研究的主要是log4j 不打印异常堆栈的相关内容,具体如下。
最近在线上系统的错误⽇志中发现了⼀个现象:
代码⾥⽤log4j打印系统运⾏时异常堆栈信息,在错误⽇志中⽆法看到堆栈信息,只有异常信息。这对于程序员来说是⼀个打击,没有堆栈信息何从查bug啊。
[01-15 11:29:26] [ERROR] [org.apache.thrift.server.AbstractNonblockingServer$FrameBuffer:524] Unexpected
log4j2不打印日志throwable while invoking!
后来发现这个是jdk的⼀个优化。JVM 为了性能会做优化,如果频繁的抛出某个异常,会重新编译,不再打印异常堆栈。
解决这个问题也⽐较简单,如果不想每次都去查前⾯的 log 去看堆栈,只要在启动参数加上 -XX:-OmitStackTraceInFastThrow,就可以禁⽤该优化,强制打印异常堆栈。这样可能会导致,log ⽂件过⼤,不过产线上今天之前的 log ⽂件都会被压缩,所以感觉问题也不⼤。
[01-15 16:40:09] [ERROR] [org.apache.thrift.server.AbstractNonblockingServer$FrameBuffer:524] Unexpected
throwable while invoking!
java.lang.NullPointerException
at end.selector.services.FilterService.filter2(FilterService.java:42)
at end.thrift.IFilterService$Result(IFilterService.java:181)
at end.thrift.IFilterService$Result(IFilterService.java:166)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
at org.apache.thrift.server.AbstractNonblockingServer$FrameBuffer.invoke(AbstractNonblockingServer.java:518) at org.apache.thrift.server.Invocation.run(Invocation.java:18)
at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
总结
以上就是本⽂关于浅谈log4j 不打印异常堆栈的全部内容,希望对⼤家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不⾜之处,欢迎留⾔指出。感谢朋友们对本站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论