今天系统升级,是web程序,备份程序之后,替换class下面的com的全部类文件后shutdown tomcat,然后启动程序,startup之后出现
java.lang.NullPointerException at org.apache.log4j.spi.LocationInfo.<init>(LocationInfo.java:104) at org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:191) at org.apache.log4j.helpers.PatternParser$LocationPatternConverter.convert(PatternParser.java:483) at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:64) at org.apache.log4j.PatternLayout.format(PatternLayout.java:503) at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:301) at org.apache.log4j.WriterAppender.append(WriterAppender.java:159) Exception in thread "Thread-1" at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:230) at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:65) at org.apache.log4j.Category.callAppenders(Category.java:203) at org.apache.log4j.Category.forcedLog(Category.java:388) at org.apache.log4j.Category.info(Category.java:663) at cn.sh.flyhyp.kvdb.service.NodeService.onSystemExist(NodeService.java:55) at cn.sh.flyhyp.kvdb.service.NodeService$1.run(NodeService.java:40)
一开始以为是log4j的问题,快速找资料,进行回滚。用原来的备份的整个工程恢复,删除正在运行的程序
启动,发现还是一样的错,就奇怪了。
这个时候我就停掉了程序,因为之前的日志太多了,有800多M(你肯定会觉得有问题,是的,我也这样认为。日志不应该有这么多。即使这么多,也应该使用log4j的分多个文件的配置,不然的话,文件会巨大到你无法打开。这么多的日志是因为:系统与第三方合作,需要积累原始报文,进行问题定位,交流)
没有办法打开,这个时候,我就想把原来的日志备份,这个时候停掉程序之后,发现日志还在刷。
我记得log4j是使用缓存的,那么这些日志是刚才启动的系统的日志输出,并不代表现在启动的程序有问题,所以将原有日志备份,清空日志=
那么就奇怪了,那么之前的升级怎么会有问题呢
这个就奇怪了了,什么回事啊。这个包从测试环境拿过来的,都验证过的了啊,这个时候就就查看系统信息,grep之后发现,尼玛
怎么又两个进程在跑。原来由于日志文件并发太大,日志刷太猛了,shutdown命令不能关闭tomcat,需要等log4j输出完成之后才能关闭。之前一直使用kill来关闭进程,今天使用shutdown就出问题了,尼玛就关闭不了了。
两个相同的程序同时大量并发写文件,受不了啊。所以就报错了,又吓死哥一场。
- 总结与反思:
1、双机互备
虽然当前系统的业务量和负载在一个很小的值,但是对于系统的稳定性来说,还是有一定的要求。特别是在今天这种情况。如果存在双机互备的情况,那么就可以升级的时候,做到几乎业务的零影响。公司的其他系统都是这样做的了,所以会在之后进行双机互备。
2、是否可以考虑使用probe等工具进行tomcat的管理。
由于系统是使用自定义的框架系统,并没有如spring那样的提供动态更改日志级别的功能。但是probe提供了对tomcat中的工程动态刷新日志配置信息的功能。是否值得接入??
但是probe在网上看资料分析,probe已经很久没有更新,并且存在一定的性能消耗。所以在对性能的评测出来之前,不建议使用。
可行方案为添加动态刷新日志级别的接口,提供日志配置的动态修改。