1. 介绍

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

有关log4cxx的更多信息可以从Apache Loggin Service的网站http://logging.apache.org获得。当前的稳定版本为0.9.7,本文内容及示例代码都是基于此版本。

2.1 获取软件包

请从官方网站获得合适的版本。也可以从下面这个链接中直接获取(直接的链接地址可能不会永远有效):

http://logging.apache.org/

下载完成后解压缩到合适的目录中

2.2 编译

原始发行包中不含编译后的代码,这个工作需要我们自己来做。打开你的IDE,打开log4cxx.dsw,会加载以下目录中的工程:

l Msvcstatic:该工程产生log4cxx的静态链接库(lib4cxx.lib和lib4cxxs.lib);

l Msvcdll:该工程产生log4cxx的动态链接库(lib4cxx.dll)。

通常情况下,工程都可以顺利编译通过。查看输出目录,把这些生成的库文件找出来,以便在下一步骤中使用。

2.3 项目环境设置

请先在IDE中打开一个需要加入日志功能的工程,或者出于实验目的,新建一个工程,以便对其进行设置。

首先需要设置log4cxx的include文件。这些文件位于log4cxx软件包的includelog4cxx目录内。请查看你的VC++ IDE中“工具->选项->项目->VC++目录->包含文件”所列出的内容,以便确定你以何种方式加入这些include文件:

l 将includelog4cxx直接拷贝到已定义的包含文件目录中。如果将log4cxx看作是一项系统服务的话,这样做是胡合乎情理的,因为你可以采用标准库的方式使用它,例如:#include

l 增加一个包含路径,以指向位于IDE外部的某一文件目录。可以简单的指向在2.1中解压缩后形成的log4cxx软件包目录。

下一步需要对2.2节产生的log4cxx库进行设置。这取决于你使用该库的方式:静态链接或者动态链接。

l 静态链接情况下需要做如下工作:为预编译器定义LOG4CXX_STATIC宏,设置位置为“Project->Setting->C/C++->Categroy->Preprossor->Proprossor Definitions”;为链接器指定依赖的库lib4cxxs.lib和Ws2_32.lib

l 动态链接情况下只需要为链接器指定依赖的库lib4cxxs.lib即可,设置方式同上。

3. 示例代码

本节展示了一个最简单的log4cxx示例,以便你可以快速的了解它。

该示例在功能上创建了一个日志服务,该日志可通过配置文件进行必要控制,并可以同时向文件和控制台输出信息。

在实现上,我们采用了一个简单的控制台程序,并使用动态链接库的方式使用log4cxx。

要实现这个目标,请按如下步骤进行:

1)创建一个名为logdemo的空白win32控制台工程,并按照2.3节所述内容对其进行设置。注意,这里我们使用动态连接口的方式。

2)在logdemo.cpp中加入实现日志功能的代码。完成后的代码清单如下:

#include "stdafx.h"
#include
#include
using namespace log4cxx;
int _tmain(int argc, _TCHAR* argv[])
{
//加载log4cxx的配置文件,这里使用了属性文件
    PropertyConfigurator::configure("log4cxx.properties");
//获得一个Logger,这里使用了RootLogger
    LoggerPtr rootLogger = Logger::getRootLogger();
//发出INFO级别的输出请求
    LOG4CXX_INFO(rootLogger, _T("它的确工作了"));
//rootLogger->info(_T("它的确工作了")); //与上面那句话功能相当
return 0;
}

,因为我们在下一步中需要使用软件包,包括编译和复制必要的文件。

以Debug方式编译工程,调试程序直到成功为止。

3)新建一个文本文件,命名为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=true
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

4)复制log4cxx.dll到输出目录。在动态链接方式下,应用程序需要能够找到这个库文件。

5)运行生成的logdemo.exe文件,查看一下运行结果,看看我们工作有没有取得成效。如果一切顺利,无论是在控制台还是在输出文件中,都应该能看到类似下面那样的输出内容:

2006-06-02 16:09:50,609 [2528] INFO root – 它的确工作了

4. 体系结构

4.1 核心类

Log4cxx有三个关键组件,它们是loggers, appenders和layouts。

Logger是log4cxx的核心类,只要执行日志操作;looger有层次结构,最顶层为RootLogger;logger是有级别的。每个logger可以附加多个Appender。Appender代表了日志输出的目标,如输出到文件、控制台等等。对于每一种appender,都可以通过layout进行格式设置。

这三类组件用示意图表示如下(不代表类关系):

(TODO:在此对三种组件分别进行说明)

4.2 配置类

此外在使用中还会用到的类有BasicConfigurator、PropertyConfigurator和DOMConfigurator等,用于对log4cxx进行配置。其中:

BasicConfigurator提供了一种简单配置,包括使用ConsoleAppder作为root appender和PatternLayout作为缺省布局。

PropertyConfigurator使用properties文件作为配置方式。

DOMConfigurator则使用properties文件作为配置方式。

(TODO:在此对配置内容进行说明)

5. 实践指导

在项目中是否使用日志,以及如何使用日志,对开发者来说都是一个需要做出的技术选择,这通常会牵扯到系统的性能,使用日志的目的等问题。我们使用日志的方式,有些是这个行业积累了多年的经验,有些则纯粹关乎个人的喜好。

1)何时使用日志

通常情况下,日志的作用在于调试和审计,如果你的项目对此有特殊需求,即可考虑使用日志。

对于调试,通常用于IDE调试器无法达到的地方。一些常见的场景包括:

分布式组件的调试。在服务器端的组件,需要通过客户端的调用来验证其工作是否正确,此时利用日志的输出作为辅助工具对错误进行诊断。

链接库调试。在无法跟踪进外部库中的情况下,这种方法非常有效。

生产环境下的调试。生产环境通常是指产品在客户处处于正式运行的状态,在出现问题时,开发者常常不在现场,借助日志的输出进行错误判断就是一个非常有效的手段。

对于审计应用,则需要视特定的情况而定,程序级的记录能力,无疑可以作为业务级审计手段的有效补充。

无论是在哪种场景下,log4cxx都是可以胜任工作的,这取决于它的灵活的配置能力及多种类型的输出方式。

2)性能问题

关闭日志,通过配置文件设置日志的关闭和打开

使用宏代替logger的输出命令

选择性输出日志。建立logger的层次结构,根据级别选择性输出

输出目标。尽可能减少输出目标

选择合适的输出格式。使用SimpleLayout将达到与std::cout相当的速度。

3)其它

使用类的全限定名对logger命名

6. 结论

Log4cxx具有的一些显著特性使得C++者可以将其放入自己的工具箱中,这些特性包括灵活的配置能力,多种输出手段,丰富的格式控制,出色的性能。如果在你的开发中需要借助于日志进行调试和审计,你也许需要log4cxx。最后,重要的一点是,如你所见,log4cxx的使用是如此的简单。

如果在SDI或者MDI程序中,可以如下步骤使用log4cxxx:

1.在CXXXApp类的头文件里加入以下几行:

#include
#include

using namespace log4cxx;

2.在CXXXApp类中增加public的成员变量:
LoggerPtr rootLogger;

3.在CXXXApp::InitInstance()的最底下增加如下代码:
    PropertyConfigurator::configure("log4cxx.properties");

rootLogger = Logger::getRootLogger();

4.以后就可以这样输入日志记录了:
    ((CXXXApp *)AfxGetApp())->rootLogger->info("On OA Manage!");

FW:Use Log4XX for Logging相关推荐

  1. Python实战之Selenium自动化测试web刷新FW

    需求:将手工登录,手工刷新服务器的FW转化为Python+Selenium实现自动化操作. 1.创建用户表,实现数据与脚本分离.需要读取模块. 2.自动化刷新FW. 不说话,直接上代码: 1userd ...

  2. python的日志库logging,真香!!!

    学习资源 Python之日志处理(logging模块) python之配置日志的几种方式 logging 官方高级用法 使用方法 LOG_FORMAT = "%(asctime)-15s - ...

  3. logging.basicConfig函数

    在UI自动化应用中,经常会出错,打log就是一个很重要的环节,python的logging.basicConfig函数 真是既方便,又简单,每次粘贴到用例前,就可以打log了.  logging模块是 ...

  4. java怎么表示log2_Java程序员修炼之道 之 Logging(2/3) - 怎么写Log

    1. 一个最基本的例子 使用Logging框架写Log基本上就三个步骤 引入loggerg类和logger工厂类声明logger记录日志 下面看一个例子 //1. 引入slf4j接口的Logger和L ...

  5. 关于使用python logging模块的几点总结

    关于使用python logging模块的几点总结 使用python的标准日志模块logging可以非常方便地记录日志.Python日志系统非常丰富.添加结构化或非结构化日志输出到python代码,写 ...

  6. Python中logging.config配置文件解读

    Python中logging.config配置文件解读 下面的函数用于配置logging模块,它们位于logging.config模块中.你可以使用这些函数来配置,也可以在logging或是loggi ...

  7. This is probably not a problem with npm. There is likely additional logging output above

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. E:\weii_objct\invoice-manage-web-view>npm start > ...

  8. [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part I...

    一.提出问题 在开发一个企业级 应用的时候,尤其在一个涉及到敏感数据的应用,比如财务系统.物流系统,我们往往有这样的需求:对于数据库中每一笔数据的添加.修改和删除,都需要有一个明确的日志,以便我们可以 ...

  9. Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等

    目录 os.os.path sys json pickle.shelve.xml.re.logging.configparse.hashlib未完待续-- os.os.path Python的os模块 ...

最新文章

  1. 独家 | 聊天机器人开发中的机器学习(附链接)
  2. 订单表的分库分表方案设计(大数据)
  3. python matplotlib 显示opencv的图像
  4. centos7和centos6的区别
  5. linux 记一次链路聚合
  6. Kalman Filter : 理解卡尔曼滤波的三重境界
  7. 华为杯数学建模优秀论文_数学建模经典例题(2016年国赛B题与优秀论文)
  8. html select onchange 失效
  9. Python 扯淡的Map-Reduce
  10. Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
  11. 上传文件数据 Requests
  12. vs不能调试_20200717调试记录(五十四)
  13. powerful number求积性函数前缀和
  14. 基于SSM实现学生竞赛管理系统
  15. Vue 常用前端UI框架
  16. 计算机硬盘密码,电脑常识之--如何给移动硬盘[硬盘]加密码
  17. dataBinding 配置问题 Could not find method buildFeatures()for arguments xxx on extension ‘android
  18. 解决windows 10在联网时依旧无法安装3DMAX2014
  19. java中build path_Eclipse中的build path详解
  20. BEV感知,是下一代自动驾驶感知算法风向吗?

热门文章

  1. 计算机网络跟Internet的区别和联系,互联网和因特网的区别与联系
  2. Smarty入门教程一----Smarty的安装
  3. 哔哩大学计算机学院跟着B站学C语言
  4. 软件分发linux,软件分发工具 | 自动化软件分发 - ManageEngine Desktop Central
  5. 个人隐私保护条例_史上最严的个人数据保护条例来了!看完你就明白GDPR是什么了...
  6. 1到n中减少了一个数,顺序被打乱,找出缺失的数
  7. mac发送微信表情卡顿(已解决!!!!)
  8. OpenCV截取一段视频
  9. 数字电路要点总结-TTL电路分析
  10. [Effective C++ --014]在资源管理类中小心copying行为