apache log4cxx 入门实践指引

关键词:log4cxx 日志 调试 C++ 

本文分为5个章节,介绍、构建、示例代码、高级教程、实践指导。章节1介绍log4cxx、调试与日志,章节2、3介绍构建过程,并提供示例代码,章节4是高级教程提供丰富的log配置操作,章节5提供实践指导

1.介绍

Apache log4cxx是一个以Apache log4j为模式的开源的C++的日志记录框架

几乎每个大型应用程序都包含自己的日志记录或跟踪 API。在代码中插入 log 语句是一种技术含量低的调试方法。它也可能是唯一的方法,因为调试器并不总是可用或适用。多线程应用程序和整个分布式应用程序通常都是这种情况。

经验表明,日志记录是开发周期的重要组成部分。它提供了几个优点。它提供了有关应用程序运行的精确上下文。一旦插入到代码中,日志记录输出的生成就不需要人为干预。此外,日志输出可以保存在持久性介质中,以便以后研究。除了在开发周期中的使用之外,足够丰富的日志记录包也可以被视为审计工具。

日志记录确实有其缺点。它可能会减慢应用程序的速度。如果太冗长,可能会导致滚动失明。为了缓解这些问题,Log4cxx被设计为可靠,快速和可扩展。由于日志记录很少是应用程的主要焦点,因此Log4cxx API力求易于理解和使用。

官方网址:https://logging.apache.org

2. 构建

2.1 要让log4cxx为你工作,通常情况下需要如下几个步骤:

1)获取软件包:得到log4xx的源代码;

2)编译:构建库文件;

3)项目环境设置:加入log4cxx支持。

2.2 获取软件包

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

2.3 编译

打开原始发行包中的代码。打开你的Visual Studio IDE,并加载以下目录中的工程:(如果你使用了其他的编译器或者IDE工具,需要通过 CMakelist.txt 获取文件依赖关系,通过目标编译工具编译依赖库,在第4章高级教程中介绍该部分)

1)Msvc\static:该工程产生log4cxx的静态链接库(lib4cxx.lib和lib4cxxs.lib)

2)Msvc\dll:该工程产生log4cxx的动态链接库(lib4cxx.dll)

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

2.3.1 项目环境设置

请先在IDE中打开一个需要加入日志功能的工程,或者出于实验目的,新建一个工程,以便对其进行设置。对于c++开发者,引用外部链接文件,通常需要完成两个部分:头文件与链接库。链接库分为动态链接和静态链接。

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

下一步需要对产生的log4cxx库进行设置。这取决于你使用该库的方式:静态链接或者动态链接。(了解静态库与动态库区别)

静态链接情况下:为预编译器定义 LOG4CXX_STATIC 宏,设置位置为“项目->属性->配置属性->C/C++->预处理器->预处理器定义”;为链接器指定依赖的库lib4cxxs.lib和Ws2_32.lib,设置位置为“项目->属性->配置属性->链接器->输入->附加依赖项”。

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

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

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

3. 示例代码

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

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

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

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

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

在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方式编译工程,调试程序直到成功为止。

2)新建一个文本文件,命名为log4cxx.properties,并键入如下内容:

设置root logger为DEBUG级别,使用了ca和fa两个Appender

log4j.rootLogger=DEBUG, ca, fa

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

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

2022-09-20 16:09:50,609 [2528] INFO root - 它的确工作了

4. 高级教程

4.1 体系结构

1)核心类
Log4cxx有三个关键组件,它们是loggers, appenders和layouts。

Logger是log4cxx的核心类,只要执行日志操作;looger有层次结构,最顶层为RootLogger;        

logger是有级别的。每个logger可以附加多个Appender。

Appender代表了日志输出的目标,如输出到文件、控制台等等。对于每一种appender,都可以通过layout进行格式设置。

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

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

2)配置类
此外在使用中还会用到的类有BasicConfigurator、PropertyConfigurator和DOMConfigurator等,用于对log4cxx进行配置。其中:
BasicConfigurator提供了一种简单配置,包括使用ConsoleAppder作为root appender和PatternLayout作为缺省布局。
PropertyConfigurator使用properties文件作为配置方式。
DOMConfigurator则使用properties文件作为配置方式。

3)使用mingw进行库文件编译并加入Eclipse中

需要两个过程进行编译

a.  CMake

b. make

c. Eclipse中加入log4cxx支持

5. 实践指导

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

5.1 何时使用日志

1)通常情况下,日志的作用在于调试和审计,如果你的项目对此有特殊需求,即可考虑使用日志。对于调试,通常用于IDE调试器无法达到的地方。一些常见的场景包括:

2)多线程的调试。使用单步调试方法是不适用的情况下,选择日志输出调试信息是一个好的选择。使用异步日志可以将日志输出的性能损失降低。这样不会阻塞调试的动态性。

3)对于审计应用,则需要视特定的情况而定,程序级的记录能力,无疑可以作为业务级审计手段的有效补充。4)生产环境下的调试。生产环境通常是指产品在客户处处于正式运行的状态,在出现问题时,开发者常常不在现场,借助日志的输出进行错误判断就是一个非常有效的手段。

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

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

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

5.2 性能问题

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

2)使用宏代替logger的输出命令。

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

4)输出目标。尽可能减少输出目标。选择合适的输出目标。

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

5.3 何时使用异步日志

Log4cxx支持异步日志输出,它使用有界缓冲区来存储日志记录事件。异步应用程序将收集发送给它的事件,然后将它们分派给附加到它的所有输出项。

异步应用程序使用单独的线程为其边界缓冲区中的事件提供服务。异步日志可以提高程序响应能力,这对时间紧迫型场景有帮助。在时间紧迫型场景下使用异步日志,通常需要配置日志输出线程的优先级别以降低日志输出线程对CPU的占用。

有些期望提高系统的响应性的场景,可使用异步日志。如本文开始所述,增加日志会减慢应用程序的速度。异步日志可以缓解这一状况。

5.4 回到同步日志

异步日志不是实时响应的。例如:在调试阶段日志程序的崩溃,缓冲区日志并没有输出到响应的输出项,这会令调试者感到迷惑,无法准确的定位程序的异常。如果确实需要应用同步日志方法,请将日志方法修改到同步日志。

5.5 使用滚动日志

滚动日志提供了丰富的配置项,可以根据需要选用。

5.6 其它

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

你可以在官网找到除第5章节以外的全部内容。

6 结束语

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

        9/21/2022

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值