最开始是发现log4cpp不同的Category向同一个日志文件输出,就会出现些莫名其妙的问题,遂写了log4cpp多线程缺角的文章。当时还因此问题给log4cpp开发者反馈bug,而log4cpp开发者认为不应该这样使用,他们认为每个Category用于独立的日志输出位置。
所以,当时就自己动手修改源码进行编译了。不过,在即使动了那个地方的隐患后,还是偶发地会出现日志文件无法完成切分的问题。
这次还是因为无法切分的故障,再次用放大镜的视角去观察RollingFileAppender的源码,配合使用win7任务管理器性能Tab页下资源监视器以发现文件占用情况,发现log4cpp RollingFileAppender使用POSIX rename文件接口函数实现文件切换。但是其在实现上没有考虑rename失败的情况,所以,在一些特殊情况下,则会造成日志只向一个文件输出,从而造成此文件过大,甚至占满磁盘。
这个异常情况,比较常见的情况就是在当rename时,日志文件被其他地方也open了。例如,有人在查看分析日志,但是因为某种原因忘记关闭了。在这种异常情况下,log4cpp就没有办法自身完成rename,所以,也就无法切分了。
因为日志文件被其他地方open是无法自身解决的问题,所以,只能两害相较取其轻,再次选择了修改log4cpp源码,判断在出现这种异常情况的时间,就对日志文件采取截取打开文件方式而不是追加的文件方式。
寄希望这次能够很好地解决这个问题,我还是很信赖log4cpp的:)注:log4cpp的源码撰写的还是非常漂亮的,从中也学到不少知识。