C++中的log


《 C++、Java、JavaScript中的日志(log)》中讲了日志的概念和应用场景,本文将进一步讲讲C++中日志记录的具体用法。C++中有很多记录log的库,比较常用的有log4cpp(log4cxx)Google Glog 。下面主要讲一个log4cpp(log4cxx)的用法。

log4cxxapache软件基金会的一个开源库,是由log4j移植过来的跨平台的日志处理跟踪项目。从官网下载的log4cxx只有源码,需要自己编译。

log4cxx的编译

1.下载apache-log4cxx-0.10.0.zipapr-1.2.11-win32-src.zipapr-util-1.2.10-win32-src.zip

2.解压apache-log4cxx-0.10.0.zip、apr-1.2.11-win32-src.zipapr-util-1.2.10-win32-src.zip

3.重命名apr-1.2.11为apr,重命名apr-util-1.2.10为apr-util;并将apr和apr-util拷贝apache-log4cxx-0.10.0根目录下。

4.以管理员的身份运行cmd.exe,并定位到log4cxx的当前apache-log4cxx-0.10.0目录下,执行以下命令:

configure

configure-aprutil

 

当执行configure-aprutil时,提示:“ 'sed' 不是内部或外部命令,也不是可运行的程序或批处理文件”。这是因为 configure-aprutil.bat 文件中使用了 Linux 下的 sed 命令windows下找不到sed命令。解决的方法有以下几种:1.下载一个sed for windows的工具;2.使用Cygwin(windows平台上运行的类UNIX模拟环境 ),再运行 configure-aprutil.bat3.手动修改。

还是手动改来的方便,将.\apr-util\include\apu.hw下的#define APU_HAVE_APR_ICONV 1改为#define APU_HAVE_APR_ICONV 0   .\apr-util\include\apr_ldap.hw下的#define APR_HAS_LDAP 1改为#define APR_HAS_LDAP 0

5.用VC6或更高版本的Visual Studio工具打开 projects/log4cxx.dsw,在打开的时候会依次要求你选择apraprutilxml工程的工作目录,在apache-log4cxx-0.10.0的子目录中找到对应的apr.dspaprutil.dspxml.dsp文件打开即可。

6.选择log4cxx为Active工程并编译。

7.在编译过程中可能报错:无法打开包括文件:“apr.h”和“apu.h”,找到对应的apr.hw重命名为apr.h,apu.h重命名为apu.h即可。

 

log4cxx的使用

<1>简单样例:

创建一个工程,设置log4cxx的头文件路径和lib库的路径,并加载log4cxx.lib文件。测试代码如下,日志信息会在命令行中输出。

[cpp]  view plain copy print ?
  1. #include "stdafx.h"  
  2.   
  3. #include "log4cxx/logger.h"  
  4. #include "log4cxx/basicconfigurator.h"  
  5. #include "log4cxx/helpers/exception.h"  
  6.   
  7. using namespace std;  
  8. using namespace log4cxx;  
  9. using namespace log4cxx::helpers;  
  10.   
  11.   
  12. int main()  
  13. {  
  14.     //@todo 重定向到文件  
  15.     LoggerPtr logger(Logger::getLogger("LogTest"));  
  16.     //初始化配制  
  17.     BasicConfigurator::configure();  
  18.   
  19.     //输出DEBUG级别的日志  
  20.     LOG4CXX_DEBUG(logger, "debug log");  
  21.     //输出TRACE级别的日志  
  22.     LOG4CXX_TRACE(logger, "debug log");  
  23.     //输出INFO级别的日志  
  24.     LOG4CXX_INFO(logger, "info log");  
  25.       
  26.     //输出WARN级别的日志  
  27.     LOG4CXX_WARN(logger, "debug log");  
  28.     //输出ERROR级别的日志  
  29.     LOG4CXX_ERROR(logger, "debug log");  
  30.     //输出FATAL级别的日志  
  31.     LOG4CXX_FATAL(logger, "debug log");  
  32.   
  33.     //ASSERT判断条件是否正确, 条件为false时,输出信息  
  34.     LOG4CXX_ASSERT(logger, 1 == 2, "1 == 2");  
  35.       
  36.     return 0;  
  37. }  


注:我用VC6.0编译log4cxx的源码,然后在VS2010中使用log4cxx库时,编译会报错:unresolved external symbol "__declspec(dllimport) public: void __thiscall log4cxx::Logger::forcedLog

这是因为不同版本的编译器编译的库可能会有不同,要在VS2010上使用,需要在VS2010上重新编译源码。

 

 

<2>.设置配制文件:

如果要将日志信息输出到文件,或同时输出到命令行和文件,则要修改配制文件。

log4cxx.properties

[plain]  view plain copy print ?
  1. # 设置root logger为DEBUG级别,使用了ca和fa两个Appender  
  2. log4j.rootLogger=DEBUG, consoleAppender, fileAppender  
  3.   
  4.   
  5. #对Appender fileAppender(输出到文件)进行设置:  
  6. # 这是一个文件类型的Appender,  
  7. log4j.appender.fileAppender=org.apache.log4j.FileAppender  
  8. # 将日志信息输出到./log4cxxTest.log,  
  9. log4j.appender.fileAppender.File=./log4cxxTest.log  
  10. # 输出方式为文件末尾追加  
  11. log4j.appender.fileAppender.Append=true  
  12. # 设置输出格式(layout)为PatternLayout  
  13. log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout  
  14. #log4j.appender.fileAppender.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n  
  15.   
  16. #对Appender consoleAppender(输出到控制台)进行设置  
  17. log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender  
  18. # 这是一个控制台类型的Appender  
  19. log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout  
  20. # 输出格式(layout)为PatternLayout  
  21. log4j.appender.consoleAppender.layout.ConversionPattern=%d [%t] %-5p %.16c - %m%n  
 

代码:

[cpp]  view plain copy print ?
  1. #include "stdafx.h"  
  2.   
  3. #include "log4cxx/logger.h"  
  4. #include "log4cxx/PropertyConfigurator.h"  
  5.   
  6. using namespace std;  
  7. using namespace log4cxx;  
  8. using namespace log4cxx::helpers;  
  9.   
  10. int main()  
  11. {  
  12.     //用指定的文件加载配制  
  13.     log4cxx::PropertyConfigurator::configure("E:/Test/log4cxx.properties");  
  14.     //创建logger  
  15.     LoggerPtr logger = Logger::getLogger("test");  
  16.      
  17.     //输出DEBUG级别的日志  
  18.     LOG4CXX_DEBUG(logger, "debug log");  
  19.     //输出TRACE级别的日志  
  20.     LOG4CXX_TRACE(logger, "debug log");  
  21.     //输出INFO级别的日志  
  22.     LOG4CXX_INFO(logger, "info log");  
  23.       
  24.     //输出WARN级别的日志  
  25.     LOG4CXX_WARN(logger, "debug log");  
  26.     //输出ERROR级别的日志  
  27.     LOG4CXX_ERROR(logger, "debug log");  
  28.     //输出FATAL级别的日志  
  29.     LOG4CXX_FATAL(logger, "debug log");  
  30.   
  31.     //ASSERT判断条件是否正确, 条件为false时,输出信息  
  32.     LOG4CXX_ASSERT(logger, 1 == 2, "1 == 2");  
  33.       
  34.     return 0;  
  35. }  

 


如果您有什么疑惑和想法,请在评论处给予反馈,您的反馈就是最好的测评师!由于本人技术和能力有限,如果本博文有错误或不足之处,敬请谅解并给出您宝贵的建议!

 

 

========================编程思想系列文章回顾========================

编程思想之异常处理

编程思想之正则表达式

编程思想之迭代器

编程思想之递归

编程思想之回调




 

你可能感兴趣的:(C++,log,编程思想,日志记录)