对于一个上点规模的C++项目而言,Log的作用是毋庸置疑的,出问题的时候,看了Log,常见的问题处理起来自是方便不过,即使遇到麻烦的问题,也可以从log总发现不少蛛丝马迹。因此一个严肃的项目应该从一开始就好好考虑如何打Log,便于分析、维护。
现实的情况却是很多项目都是从最初的数千行代码逐步庞大起来;开始的时候可能为了图方便,加log的方式大多是自己在iostream的基础上自己封装一下;等到项目扩大数十倍的时候,却发现这种方式很力不从心,Log文件凌乱复杂,难以管理。
现有的log工具,基本是分为两个阵营,经典的syslog和花哨强大的log4j,从而衍生出很多个变体。log4j基本已经成为复杂应用程序的log标准了,无奈C++的几个模仿者确各有千秋。我的情况是:
1. 不需要复杂的配置,甚至不需要配置文件,但修改log消息格式又要很方便
2. 支持自动备份功能
3. 多线程安全
4. 效率要尽量高
5. 不要有其他依赖
log4cpp很轻易的满足了我的要求,只需要用已有的RollingFileAppender准备好后端,创建PatternLayout,一切就可以了;log级别的设置完全和syslog协议一样,很直观,打log地方,调用默认的Category管理器取得一个命名的Category,其他就是简单的调用了: log(), debug(), notice(), info(), notice()….
其它库
本来最感兴趣的是log4cxx, Apache的伟大项目,功能也最全,麻烦的是它自带了两个平台库,需要额外依赖;配置文件也要显示准备,感觉太臃肿了,估计大项目采用的吧。
效率上最高的应该是pantheiosle了,据说没开启Log的情况下,overhead几乎是0,作者自称效率是log4cxx的数倍,但也依赖于STLSoft(虽然只有头文件),其打包方式也让人想避而远之,还要用作者自己写的版本选择器来选一个合适的库(Win的情况)。
还有一个是Boost的logging库,用尽了模板技巧,虽然很炫,当时没多少用,也没有通过boost 严格的review,虽然是专家写的,暂时也没时间评估和学习了。