log4cpp用了多年了, 一直用得很得心应手.
现在做网游服务器, 日志类换成了log4cxx.
log4xx会自动加载工作目录下的log4j.properties, 这一点比较好, 使用更方便了.
log4j.properties应该与log4j的配置文件完全一样吧? 通用性好.
其他方面两个日志类差不多. log4cxx::Logger对应log4cpp::Category.
Appender, Layout都是相同的概念.
自从log4cxx从0.9.7升到0.10, 据说内部架构重大更改, 而且有apache的大名顶着, 好像支持者大增.
而log4cpp成熟较早, 一直以来没什么更新, 日渐衰落.
有一点重大区别, log4cxx不支持如printf格式的变参数日志:
log4cpp::Category::getRoot().info("%s %d", "test", 3);
而log4cxx只能先格式化一个字符串后再记日志.
log4cxx::Logger::getRootLogger()->info("A string");
这样log4cxx的性能会差很多. 当日志等级不需要记日志时, 就应该不要格式化字符串.
log4cxx有一组宏, 可以先判断日志等级, 然后再输出.
LOG4CXX_DEBUG(logger, message)
可以这样调用:
LOG4CXX_DEBUG(logger, "test " << 3);
可能是出于安全的考虑, 故意禁止用户使用格式化串. 因为格式化串无法检测类型.
我以前在使用log4cpp的时候, 总是要多次检查格式化串参数是否匹配.
也碰到过因为日志导致程序崩溃的例子.
因为像警告,错误类的日志几乎是不太可能出现的.
测试时, 可能无法覆盖这类日志代码.
而使用流就可以大胆放心.
但是有大半的使用情况下, 流方式输出会显得冗长, 格式控制也没有printf简洁.
只有简单的输出才会使用流.
幸好有boost::format. 它就是类型安全的printf. log4cxx配合boost::format真是绝配.
例如:
LOG4CXX_DEBUG(logger, format("%1% %2%") % "test" % 3)
想起了好用的MFC CString::Format()和Delphi的Format(),
boost::format虽然用'%'显得怪怪的, 但绝对是更安全的格式化串.
金庆的专栏
log4cxx配合boost::format
原创wx648abf25141f7 博主文章分类:C/C++ ©著作权
©著作权归作者所有:来自51CTO博客作者wx648abf25141f7的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
QT使用log4cxx
windows系统,qt项目中使用log4cxx
qt log4cxx windows -
log4cxx的使用模式
log4cxx的使用模式(金庆的专栏)== 初始化配置 ==Main.cpp中初始化配置.如果不需要监
c apache #include User -
Glog 和 Log4cxx 的对比
cxx低; #4 两者占用c
配置文件 c++ 日志输出 -
linux下源码安装log4cxx
首先,在网上下载log4cxx和
#include 编译安装 apache -
log4cxx安装和使用
对目标程序进行调试和审计,log4cxx是apache软件基金会的开源项目,基于APR实现跨平台支持。一个良好的日志系统不管是开发、调试和维护,对一个项目来说是多么的重要,类似的日志框架还有GLog、...
#include apache 下载地址 linux 当前目录 -
spark官网查看版本对应关系
Spark Streaming使用 (scala版本)<!--运行依赖--> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.
spark官网查看版本对应关系 spark spark streaming kafka apache