logback配置

一、前言

1、最简单的使用就是不使用任何配置文件,用默认的Console输出日志,

2、使用logback.xml配置文件

最基本的配置是一个 configuration 里面有0或多个 appender,0或多个 logger 和最多一个 root 标签组成。(logback是对大小写敏感的)


二、configuration标签

configuration标签是根标签,主要有三个属性debug、scanscanPeriod

debug=true时会打印出logback内部的状态;

scan=true表示开启 logback 在配置文件改变的时候自动去扫描的功能;

scanPeriod 属性可以指定扫描周期。默认情况下,一分钟扫描一次配置文件,看是否有更改。扫描周期的时间单位可以是 milliseconds(毫秒)、seconds(秒)、minutes(分钟)或者 hours(小时)。

注意:如果没有指定时间单位,则默认为毫秒。如果更改后的配置文件有语法错误,则会回退到之前的配置文件。

示例:

<!--监测配置文件是否有修改的时间间隔:60秒-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
</configuration>

三、appender标签

 appender标签,负责写日志的组件,有两个必要属性nameclass

name="consoleLog"name属性指定appender名称,该属性值为自定义(最好见名知意);

class="ch.qos.logback.core.ConsoleAppender"class属性指定appender的全限定名用于实例化(class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略)。

appender的class 类型主要有三种:ConsoleAppenderFileAppenderRollingFileAppender。

appender标签可以0或者多个encoderfilter子标签。

 

在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" 即可。

posted @ 2022-12-08 14:52  danielzzz  阅读(1110)  评论(0编辑  收藏  举报