Java日志框架——Logback的体系结构

Logback日志框架中最重要的3个部件是Logger,Appender,Layout(即相应于《Java日志框架——基本概念》中的Logger,Appender,Formatter)


一、Logger
Logger实例主要有3个方面的内容:名字属性,Level属性和获取Logger实例。
1.1、Logger实例的名字属性
Logger实例具有名字。运行以下两个语句,得到的logger对象和logger1对象的名字都为"com.dslztx.Main"
Logger logger = LoggerFactory.getLogger("com.dslztx.Main");
Logger logger1 = LoggerFactory.getLogger(com.dslztx.Main.class);

存在一个特殊的Logger实例,它的名字为“org.slf4j.Logger.ROOT_LOGGER_NAME”,即“ROOT”


Logger实例之间具有层次关系,具体有两种层次关系:祖先子孙层次关系和父亲儿子层次关系(父亲儿子层次关系是特殊的祖先子孙层次关系)。

根据以下两个原则来确定Logger实例之间的层次关系:
1)实例名字为"ROOT"的特殊Logger实例与其他Logger实例之间的层次关系是祖先与子孙层次关系或者父亲与儿子层次关系

2)除了第1种情况外,Logger实例之间的层次关系跟相应的Logger实例名字之间的层次关系一致。比如现在有3个Logger实例A,B,C,A的名字为"com",B的名字为"com.dslztx",C的名字为"com.dslztx.Main",那么A与B是父亲儿子层次关系,B与C是父亲儿子层次关系,A与C是祖先子孙层次关系


1.2、Logger实例的Level属性

Logger实例应该设置Level属性,如果某个Logger实例的Level属性未设置,那么沿着Logger实例的层次关系向上回溯直到最顶层的"ROOT"Logger实例为止。在这个过程中,碰到的第一个配置Level属性的祖先Logger实例的Level属性值被用来作为本Logger实例的Level属性值(可取值集合为:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF)

以上过程可用图1表述:

                                                                                                                       图1


具体可见如图2,图3,图4,图5所示的4个例子。

                                            图2

Java日志框架——Logback的体系结构_第1张图片

                                            图3

Java日志框架——Logback的体系结构_第2张图片

                                            图4

Java日志框架——Logback的体系结构_第3张图片

                                             图5

Java日志框架——Logback的体系结构_第4张图片

调用Logger实例的日志记录方法,会产生日志记录请求,日志记录请求也有一个Level属性(可取值集合为:TRACE,DEBUG,INFO,WARN,ERROR)。

这两个Level属性值的用途在于:只有当日志记录请求的Level属性值大于等于相应的Logger实例的Level属性值的时候,该日志记录请求才是有效的。可用图6来进行表述。

                                                                                                        图6


给定不同Level值的大小顺序如下:
TRACE < DEBUG < INFO <  WARN < ERROR
那么现在假定有一个Logger实例A,它的Level属性值为DEBUG,调用A上的info()方法,那么得到的日志记录请求B的Level属性值为INFO,因为INFO > DEBUG,因而日志记录请求B是有效的;调用A上的trace()方法,那么得到的日志记录请求C的Level属性值为TRACE,因为TRACE < DEBUG,因而日志记录请求C是无效的。

另外,当一个Logger实例的Level值设为OFF的时候,任何在该Logger实例上产生的日志记录请求都是无效的;当一个Logger实例的Level值设为ALL的时候,任何在该Logger实例上产生的日志记录请求都是有效的。


1.3、获取Logger实例
在Logback运行的时候,LoggerContext类实例会维护一个类型为Map的map对象loggerCache,它的key为Logger实例的名字,它的value为对应的Logger实例。
当我们执行"LoggerFactory.getLogger('xxx')"语句,来检索名字为"xxx"的Logger实例时,LoggerContext类实例会先去查看loggerCache对象,看是否已经存在名字为"xxx"的Logger实例,如果存在,直接返回;否则,先创建好Logger实例(注意这里创建Logger实例的时候,会把loggerCache中不存在的祖先和父亲Logger实例都创建好)并放入loggerCache中,最后返回刚创建好的Logger实例。

即在Logback运行的时候,相同名字的Logger实例只保存一份。


二、Appender

Appender代表日志输出目的地,可以是Console,File,Sockets,DataBase等等。
一个Logger实例上可以绑定0到多个Appender实例,当在该Logger实例上产生的日志记录请求是有效的情况下,日志记录请求会被发送到所有绑定在该Logger实例上的Appender实例。

一个Logger实例上绑定的Appender实例不仅来自自身的绑定,也来自祖先和父亲Logger实例的Appender绑定,即可以继承祖先和父亲Logger实例绑定的Appender实例。该过程可以用图7进行表述。图8所示是一个具体的例子。

                                                                                                                        图7

Java日志框架——Logback的体系结构_第5张图片

                                                                                                                          图8

Java日志框架——Logback的体系结构_第6张图片


三、Layout

绑定在Appender上,用来格式化Appender的输出


参考文献:

[1]http://logback.qos.ch/manual/architecture.html

你可能感兴趣的:(数据区)