log4j无厘头异常

  今天系统升级,是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已经很久没有更新,并且存在一定的性能消耗。所以在对性能的评测出来之前,不建议使用。

  可行方案为添加动态刷新日志级别的接口,提供日志配置的动态修改。

posted @ 2013-08-05 22:12  EverMaze  阅读(568)  评论(0编辑  收藏  举报