logback配置文件的结构与解析
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>元素。