log4cxx编译

Windows环境下log4cxx的编译及使用Windows环境下log4cxx的编译及使用

 

1.介绍 Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。有关log4cxx的更多信息可以从Apache Loggin Service的网站http://logging.apache.org获得。当前的最新版本为0.10.0,本文内容及示例代码都是基于此版本。

2.获取软件包 可以从官方网站(http://logging.apache.org/log4cxx/index.html)获取源代码,下载版本为apache-log4cxx-0.10.0,下载完成后解压缩到合适目录

3.编译 下载的原始文件包中没有包含编译后的开发库,需要自己编译生成,本文使用vc.net2003编译该源文件,编译时需要如下文件包:

 apr-1.2.11-win32-src.zip和apr-util-1.2.10-win32-src.zip

这两个压缩包的下载地址分别如下:

 http://archive.apache.org/dist/apr/apr-1.2.11-win32-src.zip

 http://archive.apache.org/dist/apr/apr-util-1.2.10-win32-src.zip

下载完成后将这两个文件分别解压缩到和上面源代码相同的目录下。然后按照如下步骤进行编译:

a. 将apr-1.2.11-win32-src.zip解压后的文件名修改为:apr

b. 将apr-util-1.2.10-win32-src.zip解压后的文件名修改为:apr-util

c. 通过vc.net2003的DOS工具进入DOS窗口,此处直接在运行命令栏中输入cmd也可,不过为安全起见最后从.net2003的工具栏进入DOS界面

d. 使用cd 命令进入apache-log4cxx-0.10.0目录

e. 输入configure命令,执行configure.bat批处理文件

f. 输入configure-aprutil命令,执行configure-aprutil.bat批处理文件。

注意:由于在configure-aprutil.bat文件中使用了linux下的sed命令,所以该步可能会出现类似找不到sed命令的错误,这是由于在windows环境下编译的缘故。可以使用如下两种方法解决:1.下载一个sed for windows的工具;2.使用Cygwin;不过本人强烈推荐使用第二种方法,因为有些sed for windows的工具存在bug。关于如何在windows环境下安装Cygwin请看文章后名说明。

g. 使用vc.net2003打开Projects文件夹下的log4cxx.dsw项目,将log4cxx工程设为启动项目,然后编译即可

h. 编译成功后,就可以在projects的Debuge或者Release文件夹下看到lib和dll文件

4.项目环境设置 有两种方法可以设置环境:通过.net2003的工具栏或者使用工程属性栏配置,这里只介绍第二种,本文将通过下面的实例程序介绍如何使用第二种方法设置环境

5.实例代码 a.打开.net2003,新建一个空白的win32控制台工程,假设工程名为Test

 b.添加一个cpp文件,文件名随便命名

 c.右键点击Test工程,选择”属性”,然后在C++选项卡中添加附加库目录,注意该目录为../ apache-log4cxx-0.10.0/src/main/include

d.在属性的链接器输入选项卡的”附加依赖项”中添加” log4cxx.lib”

 e.在cpp文件中输入如下测试代码:

#include <log4cxx/logger.h>

#include <log4cxx/PropertyConfigurator.h>

 

using namespace std;

using namespace log4cxx;

 

int main(int argc, char* argv[])

{

 string trace = "fa";

 string Property = "./log.properties";

 log4cxx::PropertyConfigurator::configure(Property);

 LoggerPtr logger = Logger::getLogger(trace);

 logger->info(("How to use?"));

 LOG4CXX_INFO(logger, ("你说hello"));

 

 for(int i = 0; i < 2; i++)

 {

 LOG4CXX_DEBUG(logger, "DEBUG");

 LOG4CXX_INFO(logger, "INFO");

 LOG4CXX_WARN(logger, "WARN");

 LOG4CXX_ERROR(logger, "ERROR");

 }

 

 return 0;

}

 f.新建一个文本文件,命名为log4cxx.properties,并键入如下内容:

# 设置root logger为DEBUG级别,使用了ca和fa两个Appender

log4j.rootLogger=DEBUG, ca, fa

 

#对Appender fa进行设置:

# 这是一个文件类型的Appender,

# 其输出文件(File)为./output.log,

# 输出方式(Append)为覆盖方式,

# 输出格式(layout)为PatternLayout

log4j.appender.fa=org.apache.log4j.FileAppender

log4j.appender.fa.File=./output.log

log4j.appender.fa.Append=false

log4j.appender.fa.layout=org.apache.log4j.PatternLayout

log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

 

#对Appender ca进行设置

# 这是一个控制台类型的Appender

# 输出格式(layout)为PatternLayout

log4j.appender.ca=org.apache.log4j.ConsoleAppender

log4j.appender.ca.layout=org.apache.log4j.PatternLayout

log4j.appender.ca.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n

 g. 将编译好的log4cxx.lib和log4cxx.dll及上面的log4cxx.properties文件拷贝之Test工程目录

 h.编译运行该文件,可以看到控制台输出相关日志,并且在工程目录下会得到一个output.log的日志文件

6.补充说明 上面的log4cxx.properties文件为log4xxx的配置文件,该文件主要用来设置该如何生成日志文件及日志文件的格式等信息,关于配置文件的说明可以参考如下文档:

http://fanqiang.chinaunix.net/app/other/2006-06-22/4640.shtml

7.Cygwin的安装 关于Cygwin的安装可以参考如下说明http://www.cygwin.cn/site/install/。假设安装目录为D:/cygwin,安装成功后需要设置一下环境变量,可按如下步骤设置环境变量:

a. 右键点击我的电脑->属性->高级->环境变量

b. 在下面的系统变量中选择Path变量,在最后面添加D:/cygwin/bin即可

 

获取软件包

请从官方网站获得合适的版本,下载完成后解压缩到合适的目录中(目录中最好不要有空格,目录名最好是全英文的)。

在windows下可以用VC6.0以上的版本加载log4cxx的源码,项目文件在\log4cxx\msvc下log4cxx.dsw,然后选择F7(build all),一般情况下都能顺利编译通过。编译结束后会有以下几个文件:

1)log4cxx\msvc\lib下会有log4cxxs.lib和log4cxx.lib,其中log4cxxs.lib是用在静态库中的,log4cxx.lib是动态的引入库

2)log4cxx\msvc\bin\下会有log4cxx.dll,这是log4cxx做为静态库时的dll文件,必须要与可执行文件放在同一目录下。它跟log4cxx.lib是配合使用的。

项目环境设置

1)添加include目录,在“工具->选项->VC++目录->包含文件”,把log4cxx的include目录添加进去。成功后如下图所示:

2)根据源码编译属性时使用的字符集选择合适的字符集,我这里log4cxx编译库的时候使用的是“使用多字节字符集”,所以导入的时候,“项目->属性->常规->字符集”也是需要选择“使用多字节字符集”。

3)根据引入方式的不同而进行不同的设置

   静态库的引入方式:

1. 添加引入库的依赖项:“项目->属性->链接器->输入->附加依赖项”,填入log4cxxs.lib和WS2_32.Lib,并把log4cxxs.lib放到该项目的根目录下。

2. 添加预编译器定义,“项目->属性->配置属性->C/C++->预处理器->预处理器定义”,填入LOG4CXX_STATIC。如下图所示

3. 修改运行库的调试方法,“项目->属性->C/C++->代码生成->运行时库”,选择多线程调试(/MTd),成功后如下图所示:

动态库的引入方式:

1. 添加引入库的依赖项:“项目->属性->链接器->输入->附加依赖项”,填入log4cxx.lib,并把log4cxx.lib放到该项目的根目录下。

2. 添加log4cxx\msvc\bin\下的log4cxx.dll文件拷贝到执行文件的相应目录下

编写代码

这是一个测试代码,可以通过的

#include <log4cxx/config.h>

#include <stdlib.h>

#include <log4cxx/logger.h>

#include <log4cxx/basicconfigurator.h>

#include <log4cxx/propertyconfigurator.h>

#include <log4cxx/xml/domconfigurator.h>

#include <log4cxx/helpers/exception.h>

#include <log4cxx/ndc.h>

 

 

using namespace log4cxx;

using namespace log4cxx::xml;

using namespace log4cxx::helpers;

 

int main()

{

    int result = EXIT_SUCCESS;

 

    try

    {

       BasicConfigurator::configure();

       //PropertyConfigurator::configure("log4j.properties");

       //DOMConfigurator::configure( _T( "log4j.xml" ) );

     

       LoggerPtr rootLogger = Logger::getRootLogger();

       //LoggerPtr rootLogger = Logger::getLogger(_T("comm"));

 

       rootLogger->info(_T("它的确工作了"));

       rootLogger->warn(_T("错误啦!!"));

       /*

       NDC::push(_T("trivial context"));

       rootLogger->debug(_T("debug message"));

       rootLogger->info(_T("info message"));

       rootLogger->warn(_T("warn message"));

       rootLogger->error(_T("error message"));

       rootLogger->fatal(_T("fatal message"));

       */

    }

    catch(Exception&)

    {

       result = EXIT_FAILURE;

    }

    return result;

}

 

注意事项:

1)使用xml作为配置文件的时候一定要把log4j.dtd和xml配置文件一起放。

参考