一行日志引发的血案--程序异常中断却没有日志

一个新项目要把log4j换成logback。
网上应该早有这样的案例,同事很快搞定了。
没过几天一个严重的bug,tomcat每过10分钟左右就会出现假死,不响应任何请求。所有请求都超时。重启就好了,10分钟以后又是一样。
日志没有报错。各种怀疑:tomcat并发生数太小、系统文件打开数受限、系统内存太小、有文件流未关闭、后端服务链接池用尽,等等。
几个同事整整查了三天。
后来发现不重启tomcat,重启tomcat访问的后端一个服务,也可以恢复,当然只能是10分钟可用。
开始怀疑是这个服务的问题,但是服务日志也没发现报错。

费尽九牛二虎之力,终于定位到了一个接口,请求这个接口没有响应。

直接debug,发现竟然是一行打印日志的代码出的问题。

logger.debug("handlerAction insert{}", Json.toJson(tDeviceAction));

这再普通不过的代码了。结果表明问题就是在这行,就因为对象的一个属性为空,使得对象转json异常了。程序中断了。

程序异常退出了,tomcat这边链接没有断开,还在等结果,这样的请求多了,tomcat慢慢到达了最大请求数。就会出现无法响应的现象了。

程序异常中断怎么会没有日志呢?怪!怪!

因为是打日志的时候异常了,怎么可能打日志呢。

马上反应过来,是启动脚的问题。

 nohup /usr/local/jdk18/bin/java $JVM_OPTS -Dfile.encoding=UTF-8 com.nq.platform.PlatformMain $* > /dev/null 2>&1 &

我们直接丢弃了java系统日志。

发现这个问题之后,修改了系统中所有的启动脚本。

这个问题可能很低级,但是越是低级的问题越难排查。

希望大家不要犯同样的错误。

猜你喜欢

转载自blog.csdn.net/tiantiandjava/article/details/80135374