Log4cpp

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.properties
# 设置根日志器配置,并设置其附加器为rootAppender,日志等级为DEBUG
log4cpp.rootCategory=DEBUG, rootAppender
# 配置名为sub1的子日志器, 并设置附加器为A1, A2, 日志等级为DEBUG
log4cpp.category.sub1=DEBUG, A1, A2
# 配置sub2为sub1的子日志器,并设置附加器A3, 日志等级也为DEBUG
log4cpp.category.sub1.sub2=DEBUG, A3

# 设置rootAppender的附加器,并设置其输出位置为控制台和自定义布局模式
log4cpp.appender.rootAppender=ConsoleAppender
log4cpp.appender.rootAppender.layout=PatternLayout
log4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n

# 设置A1这个附加器输出到名为A1.log的文件中, 布局为基本布局
log4cpp.appender.A1=FileAppender
log4cpp.appender.A1.fileName=A1.log
log4cpp.appender.A1.layout=BasicLayout

# 设置A2这个附加器也是文件附加,级别为WARN, 输出到文件A2.log, 并且自定义布局
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

# 设置A3附加模式为写入文件的滚动附加,日志名为A3.log,日志最多200字节
# 同时保留一份备份日志文件,使用自定义布局
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
// main.cpp

#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.

Log4cpp
http://example.com/2024/08/03/Log4cpp/
作者
haoks
发布于
2024年8月3日
许可协议