本文共 771 字,大约阅读时间需要 2 分钟。
一个新项目要把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系统日志。
发现这个问题之后,修改了系统中所有的启动脚本。
这个问题可能很低级,但是越是低级的问题越难排查。
希望大家不要犯同样的错误。
转载地址:http://xqnmi.baihongyu.com/