log4CPP是一款优秀的c++日志开源软件,虽然从很早的时代就宣称了对于多线程的支持,而且源码中有很好的利用栈对象封装互斥锁,一种很好的使用资源实践;而且下载下来用vc6编译,也能检查到其连接的c语言库函数设定的为multiThread DLL,所以,从骨架上支持多线程应该没有多少疑问。
但是对于RollingFileAppender,实现文件日志循环打印的日志输出的类,对于多线程的支持是不够好的,可以从其实现代码对于文件描述符fd的操作看出来。 有读、有写、有关闭,但是代码里面却没有半点进行多线程的保护。
这样的实现版本,对于每个日志Category类别具有一份独立的文件RollingFileAppender,也是没有问题的。log4CPP在Category上输出日志,因为需要遍历所有的appender,以及与其他appender集合的操作互斥,而不得不加上锁。这把锁也在实际上也保护了文件操作,每一个日志类别具有独立的appender,直接使用log4cpp默认实现,则不受到影响。但如果情况恰恰是相反,很多Category仅对应一个RollingFileAppender的话,则RollingFileAppender的实现不足以保护多线程访问。
在我们的实践中,表现为日志文件超过了设定的大小,也不进行分拆,而是日志文件持续增大。对于此故障现象,怀疑为系统内部已经异常,因此也还出现其他的一些怪现象。但不是非常确切地知道是否于此有关,所以此文件标题用(一)来表示未完待续。
以前开源运动的创始人就是很痛恨鄙视遇到一些私有软件莫名问题,无法跟踪定位代码和修改代码,而造成很大的懊恼,所以,就发起了开源软件运动,在遇到问题时,进行代码走查或者编译一个版本手工调试一下,就可以知道发生了什么问题 ,而且可以将此修改建议补充到开源软件中,促进此软件的良性循环,这是一个非常好的想法,因为许多次我就是从中得益的,呵呵!
另外,在log4cpp的设计中,发现一种设计思想,用*指针传入的对象,log4cpp可能会负责将其释放和删除,但是传&引用的场景,则仅是一个引用而已,需要由外部使用者负责清除,表现最为明显的就是Category的addAppender方法。新手使用的时间,可能会犯一些错误,导致一些释放时的问题,需要注意!
整体上来讲,log4cpp还是非常好用的软件,也比较类似于log4j的设计:)