您的位置:首页 > 编程语言 > C语言/C++

C++开源log选用

2016-06-30 15:00 357 查看
C++比较有名的日志类库公有log4cpp 、log4cxx、 log4cplus、glog,其中log4cpp log4xx最近两年都没有更新了。只有log4cplus和glog在更新,因此在log4plus和glog二选一。

glog的典型用法

LOG(INFO) << “Found ” << num_cookies << ” cookies”;

是线程安全的,宏展开后会等价于新建一个LogMessage对象,然后就是c++ stream的输出,LogMessage实现里面会用锁保证写log那一步是多线程安全的,

另外还有RAW log 的那个头文件里面宏,说是可以写log的过程中都不会发生内存分配(不会依赖外部的其他锁),可以非常非常安全的,甚至在malloc函数里面使用。

log4plus的典型用法

LOG4CPLUS_INFO(logger, “Found ” << num_cookies << ” cookies”);

竟然需要提供一个logger对象,真是蛋疼。

logger对象只是多线程读是安全的,因为一般也都是读操作,应该也是可以在多线程里面对同一个logger

进行LOG4CPLUS_INFO 这样写log 调用的吧(但修改log level等操作就不是多线程安全的了?)。真正把格式化好的log message 刷到后端的appender的时候,是用锁保证安全的。但写全局变量的logger对象也是比较蛋疼的吧。

Logger对象看上去构建代价比较小,多个logger对象可以通过引用计数计数 引用底层 的单一实例的 LoggerImpl的实现的对象, 用锁保证的引用计数的多线程安全。

所以初始化log4cplus好之后,每次调用写log时都建立一个logger对象,感觉也会对性能影响很大。后面有空测试看看,下面这个性能的影响。

LOG4CPLUS_INFO(log4cplus::Logger::getRoot(), “Found ” << num_cookies << ” cookies”);

glog毕竟是google出品的,质量还是要比log4cplus要有保证一些吧,facebook这些大公司也在用,方便性和功能也都比log4cplus来的要好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cpp