1、Log4cpp概述
Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:提供应用程序运行上下文,方便跟踪调试;可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等;
2、原理
Log4cpp有三个主要的组件:日志类别(Category)、输出源(Appender)和布局(Layout)。这三种类型的组件一起工作使得系统可以根据信息的类型和级别记录它们,并且在运行时控制这些信息的输出格式和位置。
3、三个组件的介绍:
1)日志类别(Category)含义是:日志级别的意思是低于该级别的日志不会被记录。但如果配置的级别是ERROR,则只有高于ERROR优先级的日志才可以打印出来。
日志的级别总共有:
NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG
2)输出源(Appender)用来输出日志(被layout格式化后)到一些设备上,比如文件、命令行、内存等。也可以定义自己的appender输出日志信息到别的设备上。log4cpp提供的appender如下: FileAppender 输出到文件 RollingFileAppender 输出到回卷文件,即当文件到达某个大小后回卷 ConsoleAppender 输出到控制台
3)布局(Layout)显示样式PatternLayout表示让用户根据类似于C语言printf函数的转换模式来指定输出格式
PatternLayout支持以下一组格式字符:
- %% - 一个百分号;
- %c - the category;
- %d - date日期格式:日期格式字符后面可以跟着花括号括起来的日期格式说明符。例如
%d {% H: % M: % S、l %}或%d {% d % M H % Y %: % M: % S、l %}。如果没有给出日期格式说明符,则使用以下格式:”Wed Jan 02 02:03:55 1980”。
- %m - 你要输出的日志信息;
- %n - 换行符;
- %p - 优先级;
- %r - 该布局创建后的毫秒数;
- %R - 从1970年1月1日0时开始到目前为止的秒数;
- %u - 进程开始到目前为止的时钟周期数;
- %x - the NDC;
- %t - 线程的名字;
- 默认情况下,PatternLayout的ConversionPattern设置为“%m%n”。
三个组件之间的关系
Category和Appender的关系是:多个Appender可以附加到一个Category上,这样一个日志消息可以同时输出到多个设备上。
Appender和Layout的关系是:Layout附加在Appender上,appender调用layout处理完日志消息后,记录到某个
4、官方案例
官方属性配置解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=DEBUG, A1, A2
log4cpp.category.sub1.sub2=DEBUG, A3
log4cpp.appender.rootAppender=ConsoleAppender log4cpp.appender.rootAppender.layout=PatternLayout log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n
log4cpp.appender.A1=FileAppender log4cpp.appender.A1.fileName=A1.log log4cpp.appender.A1.layout=BasicLayout
log4cpp.appender.A2=FileAppender log4cpp.appender.A2.threshold=WARN log4cpp.appender.A2.fileName=A2.log log4cpp.appender.A2.layout=PatternLayout log4cpp.appender.A2.layout.ConversionPattern=%d [%p] %m%n
log4cpp.appender.A3=RollingFileAppender log4cpp.appender.A3.fileName=A3.log log4cpp.appender.A3.maxFileSize=200 log4cpp.appender.A3.maxBackupIndex=1 log4cpp.appender.A3.layout=PatternLayout log4cpp.appender.A3.layout.ConversionPattern=%d [%p] %m%n
|
官方源文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#include <log4cpp/Category.hh> #include <log4cpp/PropertyConfigurator.hh>
int main(int argc, char* argv[]) { std::string initFileName = "log4cpp.properties"; log4cpp::PropertyConfigurator::configure(initFileName);
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub1.sub2"));
root.warn("Storm is coming");
sub1.debug("Received storm warning"); sub1.info("Closing all hatches");
sub2.debug("Hiding solar panels"); sub2.error("Solar panels are blocked"); sub2.debug("Applying protective shield"); sub2.warn("Unfolding protective shield"); sub2.info("Solar panels are shielded");
sub1.info("All hatches closed");
root.info("Ready for storm.");
log4cpp::Category::shutdown();
return 0; }
|
结果:
1 2 3 4 5 6 7 8 9 10 11
| 2012-11-14 18:44:58,163 [WARN] Storm is coming 2012-11-14 18:44:58,166 [DEBUG] Received storm warning 2012-11-14 18:44:58,170 [INFO] Closing all hatches 2012-11-14 18:44:58,172 [DEBUG] Hiding solar panels 2012-11-14 18:44:58,175 [ERROR] Solar panels are blocked A3.log.1 2012-11-14 18:44:58,179 [DEBUG] Applying protective shield 2012-11-14 18:44:58,183 [WARN] Unfolding protective shield 2012-11-14 18:44:58,186 [INFO] Solar panels are shielded 2012-11-14 18:44:58,190 [INFO] All hatches closed 2012-11-14 18:44:58,192 [INFO] Ready for storm.
|