• Log4Cpp学习总结


    Log4Cpp学习总结

    准备工作

    下载地址:https://github.com/orocos-toolchain/log4cpp

    编译:使用CMake,直接configure、generate即可。打开生成的解决方案,编译即可。

    结构

    如图所示,log4cpp主要由以下几个部分组成: LoggingEvent 、Priority、Layout 、Appender、Filter、Category。其中LoggingEvent为log4cpp内部使用的输出日志信息的抽象; Priority定义了日志输出的优先级;Layout提供了日志输出格式的抽象;Appender类提供了日志输出策略的抽象,通过继承Appender,用户可将日志输出到文件、系统日志、c++标准输出流、win32调试信息等;Filter提供了日志过滤策略的抽象,通过继承Filter,用户可自定义日志的过滤策略; Category是log4cpp的中心类,主要提供了根据日志级别输出日志的接口(debug、info、notice……)。

    LoggingEvent类

    LoggingEvent类包含六个属性,分别为: categoryName(输出策略的名称)、message(日志输出的详细信息)、ndc(The nested diagnostic context)、priority(日志输出的优先级)、threadName(输出日志的线程名称)、timeStamp(时间戳)。LoggingEvent会在Category类调用debug、info、notice等日志输出接口时创建。

     

    Priority类

    Priority类定义了日志输出的优先级,log4cpp共定义了8个日志输出的优先级,由高到低分别为:EMERG(FATAL)、ALERT、CRIT、ERROR、WARN、NOTICE、INFO、DEBUG.

    优先级的设置在Appender类的接口中,每个Appender可以设置一个优先级。通过Appender类中的setThreshold设置优先级。

    在输出日志时,会判断当前输出日志的优先级,如果高于(优先级的数值越小,优先级越高)已设置的优先级,则输出日志。

     

    Layout类

    Layout类定义了日志输出格式的抽象。派生类通过重写format接口,定义自己的日志输出格式。format接口的声明如下:

     

    目前log4cpp提供了四类Layout,分别为: BasicLayout,PassThroughLayout,SimpleLayout,PatternLayout.

    BasicLayout为log4cpp的默认输出格式,输出形式为:”时间戳 优先级 策略名称 ndc 日志消息体 回车换行”

    PassThroughLayout只输出日志消息体

    SimpleLayout只输出优先级和日志消息体。

    PatternLayout根据格式化规则配置输出格式,具体的格式化规则如下:

    %c

    category

    %d

    日期;日期可以进一步的设置格式,用花括号包围,例如%d{%H:%M:%S,%l} 或者 %d{%d %m %Y %H:%M:%S,%l}。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符号与ANSI C函数strftime中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。

    %m

    消息;

    %n

    换行符,会根据平台的不同而不同,但对于用户透明;

    %p

    优先级;

    %r

    自从layout被创建后的毫秒数;

    %R

    从1970年1月1日0时开始到目前为止的秒数;

    %u

    进程开始到目前为止的时钟周期数;

    %x

    NDC

    %t

    线程名称

    PatternLayout常见的配置有: “%m%n”、“%p - %m%n “、“ %d: %p %c: %m%n”。

    PatternLayout中,为了实现不同配置的输出,定义了PatternComponent类,各种格式重写其中的append接口即可。

    Appender类

    Appender类定义了日志输出策略的抽象,用户可以通过实现其中的接口,实现自己的日志输出策略。Appender中的接口包括:

     

    为了方便用户使用,定义了AppenderSkeleton类,提供了setThreshold、getThreshold、setFilter、getFilter的默认实现,使用户定义自己的Appdener时,更加简便。

    常见的Appender有: FileAppender(将日志输出到文件)、OstreamAppender(将日志输出到标准输出流,例如cout等)、Win32DebugAppender(输出到vs的调试信息窗口,可用debug view进行调试)。

    Filter类

    Filter类实现了一组链式的过滤器,用户需要重写_decide接口,来决定某个日志是否可以输出。decide有三个返回值,ACCEPT、DENY、NEUTRAL,Appender类调用decide,来确定日志是否输出。

    根据作者的介绍,该类参考了linux的ip链,在过滤器链中,根据添加的顺序,第一个不是NEUTRAL的结果,决定日志是否输出。

    目前的版本没有Filter的实现,因此,如果需要使用该功能,需要用户自己实现。

    Category类

    Category类是log4cpp的中心类,用户输出日志,需要调用其中的debug、info、notice……等接口。

    综上,log4cpp的基本结构为,一个Category包含0个或多个Appender,Appender可以分为多种类型,最常用的为LayoutAppender,LayoutAppender又有FileAppender、OstreamAppender、Win32DebugAppender等类型。Appender可以设置各种类型的Filter,用于作为日志的过滤输出条件;LayoutAppender需要设置一个Layout,用于设置日志的输出格式。

    示例

  • 相关阅读:
    软考收获
    寻找她(指令寻址)——(软考六)
    算法探究——(软考四)
    Shell排序——软考(五)
    Java String类源码
    Java 抽象类详解
    Spring IOC Container
    Tomcat的架构
    Spring与Web框架(例如Spring MVC)漫谈——关于Spring对于多个Web框架的支持
    HTML form表单中action的正确写法
  • 原文地址:https://www.cnblogs.com/begodlike/p/15191709.html
Copyright © 2020-2023  润新知