C++中的log

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

log4cxx是apache软件基金会的一个开源库,是由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.zip、apr-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.bat;3.手动修改。

还是手动改来的方便,将.\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,在打开的时候会依次要求你选择apr、aprutil、xml工程的工作目录,在apache-log4cxx-0.10.0的子目录中找到对应的apr.dsp、aprutil.dsp、xml.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 plaincopyprint?

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

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

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

<2>.设置配制文件:

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

log4cxx.properties:

[plain] view plaincopyprint?

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

代码:

[cpp] view plaincopyprint?

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

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

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

编程思想之异常处理

编程思想之正则表达式

编程思想之迭代器

编程思想之递归

编程思想之回调

时间: 2024-10-13 10:42:15

C++中的log的相关文章

Golang中使用log(一):Golang 标准库提供的Log

Golang的标准库提供了log的机制,但是该模块的功能较为简单(看似简单,其实他有他的设计思路).不过比手写fmt. Printxxx还是强很多的.至少在输出的位置做了线程安全的保护.其官方手册见Golang log (天朝的墙大家懂的).这里给出一个简单使用的例子: package main import ( "log" ) func main(){ log.Fatal("Come with fatal,exit with 1 \n") } 编译运行后,会看到程

[Android Pro] Android studio jni中调用Log输出调试信息

reference to : http://www.linuxidc.com/Linux/2014-02/96341.htm Android 开发中,java 可以方便的使用调试信息Log.i, Log.d ...,Jni层可否使用呢?答案是肯定的. 1 为方便使用,先进行宏定义: eben_hpc_log.h内容如下: #ifndef _Included_hpc_Log#define _Included_hpc_Log#ifdef __cplusplusextern "C" {#en

android 中打 Log 的一些技巧

在 android 平台上搞开发工作,会经常用到一些 Log 输出调试信息. 众所周知,android 中有五种类型的 Log , v, d, i, w, e 这里就不再赘 述 (如果对这些不了解的朋友,推荐看 android_Tutor 的博文http://blog.csdn.net/Android_Tutor/article/details/5081713 , 上面讲的很详细) 本文主要讲一下如何统一控制 Log 的输出和关闭. 一般我们会在 debug 的版本中输出 log,而在 rele

在Android的c/c++代码中使用LOG

在Android中,Java代码通过android.util.Log输出Log信息,同样的本地c/c++代码也提供了相对应而且是更多的接口.Android直接在头文件(system/core/include/cutils/log.h)里定义了一些日志输出的宏,这些宏比android.util.Log提供了更多的日志输出接口.因此,使用这些宏,就可以进行和java代码中一样的日志输出.宏LOGD(),LOGE(),LOGI(),LOGV(),LOGW(),LOGD()分别对应android.uti

Golang中使用log(二):Golang 标准库log的实现

前一篇文章我们看到了Golang标准库中log模块的使用,那么它是如何实现的呢?下面我从log.Logger开始逐步分析其实现. 其源码可以参考官方地址 1.Logger结构 首先来看下类型Logger的定义: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write at beginning of each

Android.util.Log 关于Android开发中打印log

日常Android开发真机调试过程经常会遇到系统日志过多过快,想看的内容一闪而过的问题.而自定义些log可以很好的解决这些问题.   代码中添加 log  androidsdk中提供了log输出的api,方法在android.util.Log类中. Log.v(tag,message);        //verbose模式,打印最详细的日志 Log.d(tag,message);        //debug的日志 Log.i(tag,message);        //info的日志 Lo

学会使用Chromium中的LOG

转自:http://blog.csdn.net/kuerjinjin/article/details/43937345 简介 众所周知chromium项目无比巨大,想去快速的了解,调试并添加自己想要的功能,学会使用chromium中的LOG可以使你省很多事儿! 1.从content shell开始 多数人首次接触chromium都感觉这个项目太过于庞大,总是有无从下手的感脚: 如果我们想抛开它原有的界面单纯的去了解一下它怎么显示网页的?那么通过content api来了解chromium是一个不

Andoid java文件中的Log检查工具

AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cumtkangyi/AndroidLogChecker package com.leo.kang.tools; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; impor

log4j中isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled的封装

1. log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用 项目在应用log4j打印Debug,Info和Trace级别的log时需要加上对应的三个方法进行过滤,代码如下: if (log.isDebugEnabled()) { log.debug(" From: " + req.getFrom().toString() +                   " To: " +