zoukankan      html  css  js  c++  java
  • log4cxx入门第一篇--一个小例子

    先看官网:http://logging.apache.org/log4cxx/index.html


     转载自:http://wenku.baidu.com/view/d88ab5a9d1f34693daef3e62.html

    摘要

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

    1.介绍

    1.1 简单说明

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

    有关log4cxx的更多信息可以从ApacheLogginService的网站http://logging.apache.org获得。

     

     

       1.2体系结构

         核心类

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

    Logger是log4cxx的核心类,只要执行日志操作;looger有层次结构,最顶层为RootLogger;logger是有级别的。logger是分七个级别,分别是debug、info、warn、error、fatal、all、off,最常用的应该是debug()和info();而warn()、error()、fatal()仅在相应事件发生后才使用。每个logger可以附加多个Appender。Appender代表了日志输出的目标,如输出到文件、控制台等等。对于每一种appender,都可以通过layout进行格式设置。

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

     

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

         配置类

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

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

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

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

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

     

    2.安装(by crazyhacking)

         直接使用yum安装log4cxx.x86_64(库文件) ,log4cxx-devel.x86_64(头文件) 
     

    3.示例代码

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

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

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

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

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

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

    #include"stdafx.h"

    #include<log4cxx/logger.h>

    #include<log4cxx/propertyconfigurator.h>

     

    usingnamespacelog4cxx;

     

    int_tmain(intargc,_TCHAR*argv[])

    {

    //加载log4cxx的配置文件,这里使用了属性文件

    PropertyConfigurator::configure("log4cxx.properties");

     

    //获得一个Logger,这里使用了RootLogger

    LoggerPtrrootLogger = Logger::getRootLogger();

     

    //发出INFO级别的输出请求

    LOG4CXX_INFO(rootLogger,_T("它的确工作了"));

    //rootLogger->info(_T("它的确工作了"));//与上面那句话功能相当

     

    return0;

    }

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

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

    #设置rootloggerDEBUG级别,使用了cafa两个Appender

    log4j.rootLogger=DEBUG,ca, fa

     

    #Appenderfa进行设置:

    #这是一个文件类型的Appender

    #其输出文件(File)为./output.log

    #输出方式(Append)为覆盖方式,

    #输出格式(layout)为PatternLayout

    log4j.appender.fa=org.apache.log4j.FileAppender

    log4j.appender.fa.File=./output.log

    log4j.appender.fa.Append=false

    log4j.appender.fa.layout=org.apache.log4j.PatternLayout

    log4j.appender.fa.layout.ConversionPattern=%d[%t] %-5p %.16c - %m%n

     

    #Appenderca进行设置:

    #这是一个控制台类型的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-0216:09:50,609 [2528] INFO root -它的确工作了


     

    4.实践指导

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

    1)何时使用日志

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

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

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

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

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

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

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

    2)性能问题

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

    使用宏代替logger的输出命令

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

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

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

    3)其它

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

    5.结论

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

  • 相关阅读:
    SpringCloud微服务Zuul跨域问题
    com.netflix.zuul.exception.ZuulException: Hystrix Readed time out
    Java实现遍历N级树形目录结构
    ubuntu安装Nginx
    redis报错:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)
    Java设置接口跨域
    SpringBoot使用qq邮箱发送邮件
    linux使用Nginx搭建静态资源服务器
    Spring Boot 正常启动后访问Controller提示404
    分享2019年陆陆续续读过的书-附书单
  • 原文地址:https://www.cnblogs.com/For-her/p/3922521.html
Copyright © 2011-2022 走看看