logback配置文件的结构与解析

2020-05-26  本文已影响0人  早点起床晒太阳

1、logback整体的日志结构

包含1个<configuration>元素,包含零个或多个<appender>元素,然后是零个或多个<logger>元素,然后是最多一个<root>元素,如以下示例

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
    <appender>
        //xxxx
    </appender>   
    
    <logger>
        //xxxx
    </logger>
    
    <root>             
       //xxxx
    </root>  
</configuration>  

2、<logger>的用法

1、级别继承

这里先讲下级别继承, 参考资料:http://logback.qos.ch/manual/architecture.html#effectiveLevel
我这里直接举例子 我发现用语言说有些难,这个是官网回答

the logger named "com.foo" is a parent of the logger named "com.foo.Bar". Similarly, "java" is a parent of "java.util" and an ancestor of "java.util.Vector".

意思为name值为com.foo的logger 是name值为com.foo.Bar的logger的父级。以此类推。如果logger与子logger之间没有祖先,则称该logger为子logger的父级。
如果没有为给定的logger分配一个level,那么它将从其最接近的祖先那里继承一个已分配的级别。
根logger即root位于记录器层次结构的顶部。默认的level是DEBUG

2、基本选择规则

参考资料:http://logback.qos.ch/manual/architecture.html#basic_selection

如果一个log的级别等于或者高于logger中配置的级别,那么该logger就已被启用。
官方说法:如果p> = q,则 向具有有效级别q的logger发出级别p的日志请求。 级别排行为 TRACE < DEBUG < INFO < WARN < ERROR.

3、logger的具体用法

<logger> 标签的作用是 ---用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。
<logger> 仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
addtivity:是否向上级logger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。

示例

具体用法 我是用具体例子讲解logback.xml中的配置如下

<logger name="com.example.ceshi.test.Test4" />
<!-- 日志输出级别 -->
<root level="INFO">
    <appender-ref ref="STDOUT"/>
</root>

具体解析如下:
name值为com.example.ceshi.test.Test4的logger,没有指定logger的level,默认继承它的父级即root的级别INFO,没有设置addtivity,默认为true,将此loger的打印信息向上级传递,没有设置appender,此loger本身不打印任何信息。当执行 com.example.ceshi.test.Test4中的方法是,里面的日志会首先执行<logger name="com.example.ceshi.test.Test4" />这个logger,然后将级别为INFO及大于INFO的日志信息传递给root,本身并不打印(因为没有appender);
root接到下级传递的信息,交给已经配置好的名为STDOUT的appender处理

还有一个重要的点 参考资料:http://logback.qos.ch/manual/configuration.html,比如还是上面那个配置,我稍微修改如下

<logger name="com.example.ceshi.test.Test4" level="INFO" />
<!-- 日志输出级别 -->
<root level="ERROR">
    <appender-ref ref="STDOUT"/>
</root>

上面的解析大差不差,核心的一个疑问就是 INFO的日志在logger 中传到root中,但是root的level是ERROR,这样日志可以打印到控制台么?
测试完成是可以将INFO的信息打印出来的。官网说明如下

Let us note that the basic-selection rule depends on the effective level of the logger being invoked, not the level of the logger where appenders are attached. Logback will first determine whether a logging statement is enabled or not, and if enabled, it will invoke the appenders found in the logger hierarchy, regardless of their level.

大致意思是基本选择的规则只取决于所调用的logger,而不是appender被调用的所在的logger的日志记录的级别。logback 会首先确认是否开启了日志声明,然后会在logger的层次记录中找到附加的logger,而不管它的级别

3、<root>的用法

参考资料:http://logback.qos.ch/manual/configuration.html#rootElement

<root>元素配置根logger 即root logger. 它支持单个属性,即level属性。它不允许任何其他属性包括additivity 和name。与<logger>元素类似, <root>元素可以包含零个或多个 <appender-ref>元素。

上一篇下一篇

猜你喜欢

热点阅读