一、log4cpp概述
Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:
-
- 提供应用程序运行上下文,方便跟踪调试;
- 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等;
- 可以动态控制日志记录级别,在效率和功能中进行调整;
- 所有配置可以通过配置文件进行动态调整;
- 多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等;
二、原理
Log4cpp有三个主要的组件:日志类别(Category)、输出源(Appender)和布局(Layout)。这三种类型的组件一起工作使得系统可以根据信息的类型和级别记录它们,并且在运行时控制这些信息的输出格式和位置。
三个组件的介绍:
1)日志类别(Category)含义是:如果配置文件中设置的级别是DEBUG,则任意的log都能打印出来;但如果配置的级别是ERROR,则只有高于ERROR优先级的日志才可以打印出来。
日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL
2)输出源(Appender)用来输出日志(被layout格式化后)到一些设备上,比如文件、命令行、内存等。也可以定义自己的appender输出日志信息到别的设备上。log4cpp提供的appender如下: FileAppender 输出到文件 RollingFileAppender 输出到回卷文件,即当文件到达某个大小后回卷 ConsoleAppender 输出到控制台
3)布局(Layout):显示样式PatternLayout表示让用户根据类似于C语言printf函数的转换模式来指定输出格式
三个组件之间的关系:
- Category和Appender的关系是:多个Appender可以附加到一个Category上,这样一个日志消息可以同时输出到多个设备上。
- Appender和Layout的关系是:Layout附加在Appender上,appender调用layout处理完日志消息后,记录到某个设备上。
三、配置文件log4cpp.conf
内容如下:
1 #-------定义rootCategory的属性------- 2 3 #指定rootCategory的log优先级是ERROR,其Appenders有两个,分别是console,TESTAppender 4 log4cpp.rootCategory=ERROR, console,TESTAppender 5 6 #-------定义console属性------- 7 8 #consoleAppender类型:控制台输出 9 #下面这三条语句表示控制台输出的log输出的布局按照指定的格式;输出格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n 10 log4cpp.appender.console=ConsoleAppender 11 log4cpp.appender.console.layout=PatternLayout 12 log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n 13 14 #-------定义TESTAppender的属性------- 15 16 #RollingFileAppender类型:输出到回卷文件,即文件到达某个大小的时候产生一个新的文件 17 #下面的语句表示文件输出到指定的log文件,输出的布局按照指定的格式,输出的格式是:[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n 18 log4cpp.appender.TESTAppender=RollingFileAppender 19 20 #当日志文件到达maxFileSize大小时,将会自动滚动
21 log4cpp.appender.TESTAppender.maxFileSize=400000 22 23 #maxBackupIndex指定可以产生的滚动文件的最大数 24 log4cpp.appender.TESTAppender.maxBackupIndex=3 25 26 #fileName指定信息输出到logs/TESTAppender.txt文件 27 log4cpp.appender.TESTAppender.fileName=logs/TESTAppender.txt 28 29 #PatternLayout 表示可以灵活指定布局模式 30 log4cpp.appender.TESTAppender.layout=PatternLayout 31 32 #append=true 信息追加到上面指定的日志文件中,false表示将信息覆盖指定文件内容 33 log4cpp.appender.TESTAppender.append=true 34 log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
ConversionPattern的参数含义:
- %d 输出日志时间点的日期或时间,可以在其后指定格式,如上%d{%Y-%m-%d %H:%M:%S.%l},输出类似:2017-02-14 09:25:00.953
- %p 优先级,即DEBUG,INFO,WARN,ERROR,FATAL
- %c 输出日志信息所属的类目,通常就是所在类的全名
- %m 输出log的具体信息
- %n 回车换行
四、实际应用
在问题定位的过程中,有时由于设置的日志级别较高,打印出来的信息不够全面,因此需要通过修改配置文件来动态调整日志级别,即修改属性值log4cpp.rootCategory=ERROR 为 log4cpp.rootCategory=DEBUG 这样就可以看到最新的DEBUG级别以上的日志信息了。