log4cxx 简介

log4cxx 简介Log4cxx是开放源代码项目ApacheLoggingService的子项目之一,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。本文对log4cxx的使用及配置进行介绍,并给出一个可以快速开始的实例。最后,针对日志服务给出一些实践方面的建议。1.       介绍Log4cxx是开放源代码项目ApacheLoggingService的子项目之一,是Jav

大家好,又见面了,我是你们的朋友全栈君。Log4cxx是开放源代码项目Apache Logging Service的子项目之一,用于为C++程序提供日志功能,以便开发者对目标程序进行调试

和审计。本文对log4cxx的使用及配置进行介绍,并给出一个可以快速开始的实例。最后,针对日志服务给出一些实践方面的建议。
1.        介绍
Log4cxx是开放源代码项目Apache Logging Service的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志

功能,以便开发者对目标程序进行调试和审计。
有关log4cxx的更多信息可以从Apache Loggin Service的网站http://logging.apache.org获得。当前的稳定版本为0.9.7,本文内

容及示例代码都是基于此版本。此外,示例代码的编译环境为Windows环境中的Microsoft Visual C++ .Net 2003。
本文的示例代码可以在此下载,其中也包含了预编译好的log4cxx的库文件。
2.        集成log4cxx到IDE
要使用log4cxx,首先需要将其集成到你的项目开发环境中。以下针对Windows环境中的Microsoft Visual C++ .Net 2003进行说明

,其他环境的配置信息请参考官方文档。
要让log4cxx为你工作,通常情况下需要如下几个步骤:
l           获取软件包:得到log4xx的源代码;
l           编译:构建库文件;
l           项目环境设置:加入log4cxx支持。
2.1        获取软件包
请从官方网站获得合适的版本。也可以从下面这个链接中直接获取(直接的链接地址可能不会永远有效):
http://mirror.vmmatrix.net/apache/logging/log4cxx/log4cxx-0.9.7.tar.gz
下载完成后解压缩到合适的目录中,因为我们在下一步中需要使用软件包,包括编译和复制必要的文件。
2.2        编译
原始发行包中不含编译后的代码,这个工作需要我们自己来做。打开你的IDE,并加载以下目录中的工程:
l           Msvc\static:该工程产生log4cxx的静态链接库(lib4cxx.lib和lib4cxxs.lib);
l           Msvc\dll:该工程产生log4cxx的动态链接库(lib4cxx.dll)。
通常情况下,工程都可以顺利编译通过。查看输出目录,把这些生成的库文件找出来,以便在下一步骤中使用。
2.3        项目环境设置
请先在IDE中打开一个需要加入日志功能的工程,或者出于实验目的,新建一个工程,以便对其进行设置。
首先需要设置log4cxx的include文件。这些文件位于log4cxx软件包的include\log4cxx目录内。请查看你的VC++ IDE中“工具->选

项->项目->VC++目录->包含文件”所列出的内容,以便确定你以何种方式加入这些include文件:
l           将include\log4cxx直接拷贝到已定义的包含文件目录中。如果将log4cxx看作是一项系统服务的话,这样做是胡合乎情理

的,因为你可以采用标准库的方式使用它,例如:#include <log4cxx/logger.h>
l           增加一个包含路径,以指向位于IDE外部的某一文件目录。可以简单的指向在2.1中解压缩后形成的log4cxx软件包目录。
下一步需要对2.2节产生的log4cxx库进行设置。这取决于你使用该库的方式:静态链接或者动态链接。
l           静态链接情况下需要做如下工作:为预编译器定义LOG4CXX_STATIC宏,设置位置为“项目->属性->配置属性->C/C++->预

处理器->预处理器定义”;为链接器指定依赖的库lib4cxxs.lib和Ws2_32.lib,设置位置为“项目->属性->配置属性->链接器->输

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

3.        示例代码
本节展示了一个最简单的log4cxx示例,以便你可以快速的了解它。
该示例在功能上创建了一个日志服务,该日志可通过配置文件进行必要控制,并可以同时向文件和控制台输出信息。
在实现上,我们采用了一个简单的控制台程序,并使用动态链接库的方式使用log4cxx。
要实现这个目标,请按如下步骤进行:
1)创建一个名为logdemo的空白win32控制台工程,并按照2.3节所述内容对其进行设置。注意,这里我们使用动态连接口的方式。
2)在logdemo.cpp中加入实现日志功能的代码。完成后的代码清单如下:
#include “stdafx.h”
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>

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

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的使用是如此的简单。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149120.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月24日 下午10:46
下一篇 2022年6月24日 下午10:46


相关推荐

  • python与pycharm区别_jython和python

    python与pycharm区别_jython和pythonipython和pycharm和python区别pycharm是一种pythonIDE(IntegratedDevelopmentEnvironment,集成开发环是用于提供程序开发环境的应用程序,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套,所有具备这一特性的软件或者软件套都可以叫集成开发环境。如微软的VisualStudio系列,Borland的C++Builder、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。IDE多被用于开发HTML应用

    2022年8月28日
    6
  • Python从入门到进阶之六:Pycharm中如何加入代理

    Python从入门到进阶之六:Pycharm中如何加入代理有时候我们需要引入不同的类库,最简单的方法就是通过加入代理,可以在线引入多种多样的类库加代理的方式也非常简单找到File>settings或者通过快捷键settings(CTRL+ALT+S)输入http搜索然后加入自己需要代理的IP以及端口即可(hostname,port)…

    2022年8月29日
    5
  • 十大Intellij IDEA快捷键

    十大Intellij IDEA快捷键IntellijIDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发时的使用频率,简单分类列一下我最喜欢的十大快捷-神-键吧。1智能提示Intellij最强大的功能当然就是Intelligence智能!基本的代码提示用Ctrl+Space,还有…

    2022年5月14日
    41
  • NDP和LLDP协议

    NDP和LLDP协议NDP和LLDP作用是一样,NDP:用来发现直接相连的邻居信息,包括邻接设备的设备名称、软/硬件版本、连接端口等,另外还可提供设备的id、端口地址、硬件平台等信息LLDP:它提供了一种标准的链路层发现方式,可以将本端设备的的主要能力、管理地址、设备标识、接口标识等信息组织成不同的TLV(Type/Length/Value,类型/长度/值),并封装在LLDPDU(LinkLaye…

    2022年6月2日
    61
  • dpkg命令用法[通俗易懂]

    dpkg命令用法[通俗易懂]dpkg是一个Debian的一个命令行工具,它可以用来安装、删除、构建和管理Debian的软件包。下面是它的一些命令解释:1.安装软件命令行:dpkg-i<.debfilename>示例:dpkg-iavg71flm_r28-1_i386.deb2.安装一个目录下面所有的软件包命令行:dpkg-R示例:dpkg-R/usr/local/src3.释放软件包,但是不进行配

    2022年5月21日
    109
  • python encode和decode函数说明[通俗易懂]

    python encode和decode函数说明[通俗易懂]字符串编码常用类型:utf-8,gb2312,cp936,gbk等。python中,我们使用decode()和encode()来进行解码和编码在python中,使用unicode类型作为编码的基础类型

    2022年7月1日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号