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,用于设置日志的输出格式。
示例