用VS2003打开整个源码工程,仔细读代码,方式为结合文档来读;
首先打开log4cpp-docs-1.0/api/index.html在File List 标签下浏览整个头文件信息,然后浏览整个头文件的依赖关系
一:经过梳理:
第一层为Export.hh是整个工程都要包含的头文件,仔细阅读,发现就是一个跨平台的导出方式的宏定义;这样在程序中只需要用LOG4CPP_EXPORT这个类型就可以,其他的跨平台操作动作都由Export.hh来自动完成;
第二层为Portability.hh,包含可移植代码,它包含config.h,Export.hh,strstream,比如说,如果没有定义这个宏LOG4CPP_HAVE_SSTREAM,那么后面的很多文件都用不了功能强大的ostringstream类,在这里给个它的实现方法;以备默认使用;
二:类的层次结构:
内部的所有以下划线_开头的函数和变量都代表是成员函数或者成员变量。
log4cpp有3个主要的组件:categories(类别)、appenders(附加目的地)、和 layouts(布局)。
category类主要由内部友元类HierarchyMaintainer来管理和维护,它主要是实现对所有的appenders,以及日志记录级别Priority的管理和操作。
Appender类代表日志写到的地方,可以是std::cout,即标准显示器输出;也可以是文件;还可以是系统日志,它内部主要是通过std::map来实现对所有目的地对象的管理和操作,appender的名字作为key,appender对象的指针作为值。
PatternLayout类代表布局,即以什么样子的格式写到目的地;它的内部有十来个组件,可以把不同的日志项,输出到不同的目的地;由一个std::vector来对它们的对象指针进行管理,通过setConversionPattern来设置具体格式,举例如下:
Layout为PatternLayout的一个对象,则可以像下面这样设置格式
layout->setConversionPattern("%% %r %c:%d (%R / %r) [%p] %x %m %% (%u) %n");