问题的由来
使用过 Log4J 的朋友应该有这样酷的体会,通过修改配置文件可以很方便得实现对应用程序的日志行为进行定义,而这些都不需要修改任何的应用程序代码。也许你会说,这些在 Java 中是很容易实现的(使用 classforname 就可以很容易实现了)。
问题的由来
使用过 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 ();