logback配置
一、前言
1、最简单的使用就是不使用任何配置文件,用默认的Console输出日志,
2、使用logback.xml配置文件
最基本的配置是一个 configuration 里面有0或多个 appender,0或多个 logger 和最多一个 root 标签组成。(logback是对大小写敏感的)
二、configuration标签
configuration标签是根标签,主要有三个属性debug、scan
和scanPeriod
。
debug=true
时会打印出logback内部的状态;
scan=true
表示开启 logback 在配置文件改变的时候自动去扫描的功能;
scanPeriod
属性可以指定扫描周期。默认情况下,一分钟扫描一次配置文件,看是否有更改。扫描周期的时间单位可以是 milliseconds(毫秒)、seconds(秒)、minutes(分钟)或者 hours(小时)。
注意:如果没有指定时间单位,则默认为毫秒。如果更改后的配置文件有语法错误,则会回退到之前的配置文件。
示例:
<!--监测配置文件是否有修改的时间间隔:60秒-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>
三、appender标签
appender标签,负责写日志的组件,有两个必要属性name
和class
。
name="consoleLog"
name属性指定appender名称,该属性值为自定义(最好见名知意);
class="ch.qos.logback.core.ConsoleAppender"
class属性指定appender的全限定名用于实例化(class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略)。
appender的class 类型主要有三种:ConsoleAppender、FileAppender、RollingFileAppender。
appender标签可以0或者多个encoder
和filter
子标签。
在logback中layout对象被封装在encoder中,也就是说我们使用的encoder其实就是layout
示例:
<configuration>
...
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
...
</configuration>
四、logger标签
通过logger标签来对 logger(日志记录器)进行配置,它必须包含一个 name属性,一个可选的 level属性,一个可选 additivity属性。
name="org.example"
name属性用于指定需要打印日志的包或类的全限定名;
additivity="false"
它只是阻止了日志事件向上传播到父日志记录器,而不是改变日志级别的继承关系。additivity
属性默认值为true;
level="INFO"
level取值可为 TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF,INHERITED,NULL。当 level 的值为 INHERITED 或 NULL 时,将会强制 logger 继承上一层的级别。
logger标签可以包括0个或者多个appender-ref
子标签,用于指定当前日志输出的目的地。
示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.example" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
五、root标签
root logger 通过root标签来进行配置。它只支持一个属性level
。它不允许设置其它任何的属性,因为 additivity 并不适用 root logger。而且root logger 的名字已经被命名为 “ROOT”,也就是说也不支持 name 属性。level 属性的值可以为:TRACE、DEBUG、INFO、WARN、ERROR、ALL、OFF。如果没有声明level属性,其默认值为 DEBUG,但是他的值不能设置为 INHERITED 或 NULL。
跟logger标签类似,root标签可以包含 0 或多个 <appender-ref>
子标签。
注意:root标签是一个特殊的logger标签,其主要作用是给其他的logger标签提供统一的配置(日志级别和日志输出目的地)。
示例:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 继承父级的日志配置:将日志打印到控制台 -->
<logger name="org.example" level="INFO" />
<root level="OFF">
<!-- 将日志打印到控制台,ref属性值就是appender标签的name属性值 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
六、疑问解答
疑问1:当logger和root设置的level不一致时,以谁为准?
当logger没有声明level属性或level属性为null时,此logger会强制继承上级【root】的日志级别,即使是显示声明了additivity="false"
【root的默认日志级别为DEBUG】。
简而言之,root和logger类似java中的继承关系,存在子项logger时,父项root的配置则失效或被子项继承【是否继承取决于logger的additivity属性值】
我们按日志级别从低到高分别打印一次日志,控制台输出如下:
疑问2:上述的控制台打印结果为什么同级别的日志消息都输出了两次?
此问题与additivity属性有关。在 LogBack 中,additivity
属性的默认值是true
。这意味着日志事件会从当前记录器传播到其祖先(父)记录器。
由于root标签已经配置了一个appender,再加上传播过去的appender就有两个日志输出配置,他们会同时生效。故控制台的日志消息会输出两次。
解决方法:将additivity的取值改为"false" 即可。