天天看点

log4CXX在windows上编译与应用

转自:http://blog.csdn.net/mr0pengpeng/article/details/20727753

Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。

下载的原始文件包中没有包含编译后的开发库,需要自己编译生成,下面简要介绍log4cxx在vs2010上的编译。

log4cxx的编译需要三个文件夹所包含的内容,分别为:

1.apach-log4cxx-0.10.0.zip  http://logging.apache.org/log4cxx/index.html

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

3.apr-util-1.2.10-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.       在运行命令栏中输入cmd,进入apache-log4cxx-0.10.0目录   

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

e.        输入configure-aprutil命令,执行configure-aprutil.bat批处理文件,此时可能会提示找不到sed命令的错误,下载sed工具并安装(http://sourceforge.net/projects/gnuwin32/files/sed/sed-4.2-1-setup.exe/download)并将安装目录下的bin加入环境变量内;,然后重新执行configure-aprutil.bat

f.   进入apache-log4cxx-0.10.0->projects,用vs2010打开log4cxx.dsw,将log4cxx工程设为启动项目,然后编译。

编译过程中会出现很多错误,主要都是error C2252: an explicit instantiation of a template can only occur at namespace scope这个,解决办法:

#define LOG4CXX_LIST_DEF(N, T) /

template class LOG4CXX_EXPORT std::allocator<T>; /

template class LOG4CXX_EXPORT std::vector<T>; /

typedef std::vector<T> N

替换为

#define LOG4CXX_LIST_DEF(N, T) /

typedef std::vector<T> N

编译成功后,链接过程又抛一大堆链接错误,主要说找不要一些obj(apr,apr-util,xml)。解决办法:手动把这些相关项目的引用给添上(apr,apr-util,xml)。

接下来编译成功后可看到debug下出现log4cxx.lib,log4cxx.dll。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <string.h> #include <log4cxx/logger.h> #include <log4cxx/propertyconfigurator.h>   using namespace log4cxx ; #pragma comment(lib,"log4cxx.dll")   int main ( int argc , char * argv [ ] )    {         std :: string Property = "./log.properties" ;         log4cxx :: PropertyConfigurator :: configure ( Property ) ;         LoggerPtr logger = Logger :: getRootLogger ( ) ;           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" ) ;         }         getchar ( ) ;      return 0 ;

在可执行文件目录下添加dll文件,并且将头文件目录加入项目属性中。此外,log4cxx还可根据日期,大小生成日志文件,如:

按日期生成:

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

log4j.appender.R.DatePattern = yyyy-MM-dd ‘.log’

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

log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

以上配置是每天产生一个备份文件。每天生成的日志名称为 yyyy-mm-dd.log 。

类似的,如果需要每月产生一个文件可以修改上面的配置:

将 log4j.appender.R.DatePattern = yyyy-MM-dd ‘.log’

改为  log4j.appender.R.DatePattern = yyyy-MM ‘.log’

继续阅读