`

logback官方reference摘要

阅读更多
最近在读logback的源码,读到appender的部分,感到有点梳理不清楚,所以先看看官方的用户指南reference,帮助一下理解,以下是reference的摘要:

logger L的有效级别等于其层次等级里的第一个非null级别,顺序是从L开始,向上直至根logger

为确保所有logger都能够最终继承一个级别,根logger总是有级别,默认情况下,这个级别是DEBUG

记录请求级别为p,其logger的有效级别为q,只有则当p>=q时,该请求才会被执行
该规则是logback的核心。级别排序为:TRACE < DEBUG < INFO < WARN < ERROR

用同一名字调用LoggerFactory.getLogger方法所得到的永远都是同一个logger对象的引用。因此,可以配置一个logger,然后从其他地方取得同一个实例,不需要到处传递引用

Logback不限制logger名,可以随意命名logger。然而,目前已知最好的策略是以logger所在类的名字作为logger名称

一个logger可以被关联多个appender

Logger L的记录语句的输出会发送给L及其祖先的全部appender。这就是“appender叠加性”的含义。

然而,如果logger L的某个祖先P设置叠加性标识为false,那么,L的输出会发送给L与P之间(含P)的所有appender,但不会发送给P的任何祖先的appender

如果Logger L自己的叠加性标识为false,那么L的输出只会发送给自己的appender,不会发送给L的任何祖先的appender

1. 取得过滤链(filter chain)的判定结果
如果TurboFilter链存在,它将被调用。Turbo filters能够设置一个上下文范围内的临界值,这个临界值或者表示过滤某些与信息有关(比如Marker、级别、Logger、消息)的特定事件,或者表示与每个记录请求相关联的Throwable。如果过滤链的结果是FilterReply.DENY,则记录请求被抛弃。如果结果是FilterReply.NEUTRAL,则继续下一步,也就是第二步。如果结果是FilterReply.ACCEPT,则忽略过第二步,进入第三步

2. 应用基本选择规则
Logback对logger的有效级别与请求的级别进行比较。如果比较的结果是记录请求被禁用,logback会直接抛弃请求,不做任何进一步处理。否则,继续下一步

3. 创建LoggingEvent对象
记录请求到了这一步后,logback会创建一个ch.qos.logback.classic.LoggingEvent对象,该对象包含所有与请求相关的参数,比如请求用的logger、请求级别、消息、请求携带的异常、当前时间、当前线程、执行记录请求的类的各种数据,还有MDC。注意有些成员是延迟初始化的,只有当它们真正被使用时才会被初始化。MDC用来为记录请求添加额外的上下文信息。之后的章节会讨论MDC

4. 调用appender
创建了LoggingEvent对象后,logback将调用所有可用appender的doAppend()方法,这就是说,appender继承logger的上下文。
所有appender都继承AppenderBase抽象类,AppenderBase在一个同步块里实现了doAppend方以确保线程安全。AppenderBase的doAppender()方法也调用appender关联的自定义过滤器,如果它们存在的话。自定义过滤器能被动态地关联到任何appender,另有章节专门讲述它

5. 格式化输出
那些被调用了的appender负责对记录事件(LoggingEvent)进行格式化。然而,有些但不是全部appender把格式化记录事件的工作委托给layout。Layout对LoggingEvent实例进行格式化,然后把结果以字符串的形式返回。注意有些appender,比如SocketAppender,把记录事件进行序列化而不是转换成字符串,所以它们不需要也没有layout

6. 发送记录事件(LoggingEvent)
记录事件被格式化后,被各个appender发送到各自的目的地

Logback采取下面的步骤进行自我配置:
1. 尝试在classpath下查找文件logback-test.xml;
2. 如果文件不存在,则查找文件logback.xml;
3. 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台

Logback把内部数据放在一个StatusManager对象里,并通过LoggerContext访问

Logger是用<logger>元素配置的。<logger>元素有且仅有一个name属性、一个可选的level属性和一个可选的additivity属性

<logger>元素可以包含零个或多个<appender-ref>元素,表示这个appender会被添加到该logger

Appender用<appender>元素配置,该元素必要属性name和class

<appender>元素可以包含零个或多个<layout>元素、零个或多个<encoder>元素和零个或多个<filter>元素

<layout>元素的class属性是必要的,表示将被实例化的layout类的全限定名。因为太常用了,所以当当layout是PatternLayout时,可以省略class属性

<encoder>元素class属性是必要的,表示将被实例化的encoder类的全限定名。因为太常用了,所以当当encoder是PatternLayoutEncoder时,可以省略class属性

默认情况下,appender是可累积的:logger会把记录输出到它自身的appender和它所有祖先的appender。因此,把同一appender关联到多个logger会导致重复输出

doAppend()方法也许是logback框架里最重要的方法,它负责以适当的格式将记录事件输出到合适的设备

所以能被引用。Appender接口扩展了FilterAttachable接口,因此appender实例可被关联一个或多个过滤器

Appender是最终负责输出记录事件的组件。然而,它们可以把实际格式化的任务委托给Layout或Encoder对象。每个layout/encoder都关联到一个且仅一个appender。有些appender有内置的或固定的事件格式,因此它们不需要也没有layout/encoder

doAppend()方法然后调用派生类的append()方法,此方法真正把事件增加到合适的设备

Encoder负责两件事,一是把事件转换为字节数组,二是把字节数组写入输出流

目前,PatternLayoutEncoder是唯一有用的encoder,它基本上是封装了PatternLayout,让PatternLayout负责大多数工作。因此,似乎encoder并没有带来多少好东西,反而只有不需要的复杂性。然而,我们希望当新的、强大的encoder到来时,这种印象会改变

Layout负责把事件转换成字符串

Logback的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从而组成任意的复合过滤策略

Logback-classic提供两种类型的过滤器:常规过滤器和TuroboFilter过滤器

TurboFilter对象被绑定到记录上下文。因此,不仅当指定的appender被使用时会调用TurboFilter,而且每次执行记录请求时也会调用它们。它们的作用范围(scope)比关联到appender的过滤器大。
更重要的是,它们在LoggingEvent创建之前被调用。TurboFilter对象过滤记录请求时不需要先初始化记录事件。TurboFilter是用来高性能地过滤记录事件的,设置可以发生在记录事件被创建之前

在logback里,每个logger对象都是由LoggerContext制造的,只要logger对象还存活于内存,它就始终关联到LoggerContext
分享到:
评论
2 楼 kyfxbl 2014-06-03  
杨瑞敏 写道
大哥你好:
    是不是logback只在classpath中找配置文件,如果把logback.xml文件放在其他路径,比如项目的根目录,应该如何设置,谢谢!


默认就是在classpath下查找的。如果你要放在别的地方,那么有2个办法:

1、将你放配置文件的路径,指定到classpath里
2、写代码,手抖加载logback配置文件

明显都不太方便,实际上,logback的配置文件,我觉得放在根目录下也没问题的
1 楼 杨瑞敏 2014-05-29  
大哥你好:
    是不是logback只在classpath中找配置文件,如果把logback.xml文件放在其他路径,比如项目的根目录,应该如何设置,谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics