本文转自http://jnn.blogbus.com/logs/1879300.html
问题的由来
使用过Log4J 的朋友应该有这样酷的体会,通过修改配置文件可以很方便得实现对应用程序的日志行为进行定义,而这些都不需要修改任何的应用程序代码。也许你会说,这些在Java中是很容易实现的(使用classforname 就可以很容易实现了)。
但是对于使用C++来进行日常开发的朋友,如果要实现这样的功能又如何来做呢?因为C++语言本身并不支持这样的通过读取配置文件动态创建对象的功能。
在Log4Cplus 中,使用C++来这种动态配置生成对象的功能,它是怎么实现呢?要知道C++可没有类似于java的class loader以及 reflection 机制,看来需要自己动手来实现通过读取配置产生合适的logger appender对象了。
好在Log4Cplus是一个为C++开发的开源logger库,它实现了一个C++版的Log4J。我们可以通过分析它来探究一下C++实现读取配置文件动态创建对象实现原理。
分析功能,通过读取配置文件后获得需要加载的信息内容,然后通过相关对象实例模块来实现对象实例化操作。
初步分析, 系统通过读取配置文件来负责加载相关的类实例, 因此分析可以从配置模块内部入手, 实现基本的初始化分析。
通过分析源代码目录发现与系统配置相关的对象有以下几部分内容
Properties
PropertyConfigurator
BasicConfigurator
重点分析 PropertyConfigurator中的相关代码模块。
下面将结合PropertyConfigurator中的实例来进行分析
—如何实现Appender的动态可配置功能
--需要分析方法实现
--- initializeLog4cplus();
---configureAppenders();
---configureLoggers();
---configureAdditivity();
代码部分
通过这种方式来实现
AppenderFactoryRegistry
LayoutFactoryRegistry
FilterFactoryRegistry
的初始化工作 – 如果要加入新的类型的数据的支持,需要将这部分的内容也要实现
如何利用Registry中的内容来实现对象数据的创建?
注意
得到的指针内容都是Factory中定义的内容,
通过调用Factory方法来获取具体的能够使用的对象的实例
AppenderFactory返回的指针是SharedAppenderPtr
这两者之间有什么样的区别联系?
通过auto_ptr可以知道对象实例在返回之后,需要将对象的生命周期交给外部的使用者,由使用者负责堆对象实例的析构工作.
分析成果
配置文件的定义实现,包含的基本类,以及这些类的实现.
对于实现的动态配置的考虑:
1. 通过生成RegistryFactory完成所有需要加载的对象的工厂方法的初始化,
2. 分析配置文件来实现不同方法的调用的实现
3. 加载完成Configure文件之后,既实现的基本的数据的获取和采集功能.