其实RollingFileAppender的功能并不完美,我在上一篇的评论中也提到,使用RollingFileAppender产生日期文件名有可能慢半拍,因为这是我测试出来的,但是什么原因导致的呢?我用了一下午的时间去看了RollingFileAppender的代码,结果发现,它的日期只能是递增的,也就是说,假如产生了log20060420.log的日志文件的话,如果由于某种原因,系统的时间是2006-04-18时,它不会生成log20060418.log文件,它会把18号的日志记到log20060420.log文件里。刚才说的产生日期文件名有可能慢半拍只是表面,而其原因就在于此,所以当系统的时间从2006-4-20设置为2006-4-18,再设置为2006-4-21时,只会生成两个日志文件,log20060420.log和log20060421.log,也许这并不算啥,但这就违背了按照日期来产生日志文件的初衷,也许很多人都觉得着没啥,但使用log4net的系统有很多,如果你的系统要求的日志比较严格的话,这无疑是个缺陷,假如有人把系统的时间改为以前的某个时间,然后对系统做了一些手脚(搞破坏),管理员通过看日志文件名就会感觉不对劲,而RollingFileAppender并没有做到这一点,所以我对它进行了改进。 在这里,我想说一下上一篇中对log4net的改进,说实话,很糟糕,虽然功能上实现了自己需要的功能,却破坏了其本来完整的体系,极有可能带来代码地震,所以,我要说上一篇的改进很不理智的,希望不要误导刚使用log4net的朋友。
接下来,我已经把RollingFileAppender修改了一下,使它的日期文件名不局限于递增的,真正达到按照日期来产生日志文件的目的。首先,我想说一下,原始的RollingFileAppender是怎么产生按照日期的日志文件名的。首先,你的配置文件要是这样的:
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
我的修改很简单,就是把比较的方法改一下,如果不属于同一个日期范围内的,就产生新的日志文件。
代码修改仅在RollingFileAppender里,步骤如下:
1)增加比较的方法:
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
2)修改方法ActivateOptions() 的代码,把m_nextCheck = NextCheckDate(m_now, m_rollPoint);改为:m_nextCheck = m_now;
3)修改方法Append的代码:把原来的代码
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
改为:
![None.gif](/Images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](https://www.cnblogs.com/Images/dot.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
4)修改方法:RollOverTime把SafeOpenFile(m_baseFileName, false);改为SafeOpenFile(m_baseFileName, true);作用:使文件支持追加。
这样就修改结束了。原来的问题就不存在了。下面有一些感想,想顺便说一下,说实在的,在这里写随笔,感觉有很大的压力,怕误导别人是最担心的,电影《霍元甲》里有句经典的话:在台下只是看个热闹,而台上确实生死相搏。不知道你是否也深有同感?!欢迎大家批评指正!