Java日志记录框架Logback详解(2)

2018-03-26 22:57:48.779 [main] INFO  Java.lang.Object - =====info=====
2018-03-26 22:57:48.782 [main] WARN  java.lang.Object - =====warn=====
2018-03-26 22:57:48.782 [main] ERROR java.lang.Object - =====error=====

logback.xml的意思是,当Test方法运行时,root节点将日志级别大于等于info的交给已经配置好的名为"STDOUT"的<appender>进行处理,"STDOUT"将信息打印到控制台上。

接着理解一下<logger>节点的作用,logback.xml修改一下,加入一个只有name属性的<logger>:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="false" scanPeriod="60000" debug="false">

<appender>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
    </appender>
   
    <logger />
     
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
     
</configuration>

注意这个name表示的是LoggerFactory.getLogger(XXX.class),XXX的包路径,包路径越少越是父级,我们测试代码里面是Object.class,即name="java"是name="java.lang"的父级,root是所有<logger>的父级。看一下输出为:

2018-03-27 23:02:02.963 [main] DEBUG java.lang.Object - =====debug=====
2018-03-27 23:02:02.965 [main] INFO  java.lang.Object - =====info=====
2018-03-27 23:02:02.966 [main] WARN  java.lang.Object - =====warn=====
2018-03-27 23:02:02.966 [main] ERROR java.lang.Object - =====error=====

出现这样的结果是因为:

<logger>中没有配置level,即继承父级的level,<logger>的父级为<root>,那么level=debug

没有配置additivity,那么additivity=true,表示此<logger>的打印信息向父级<root>传递

没有配置<appender-ref>,表示此<logger>不会打印出任何信息

由此可知,<logger>的打印信息向<root>传递,<root>使用"STDOUT"这个<appender>打印出所有大于等于debug级别的日志。举一反三,我们将<logger>的additivity配置为false,那么控制台应该不会打印出任何日志,因为<logger>的打印信息不会向父级<root>传递且<logger>没有配置任何<appender>,大家可以自己试验一下。

接着,我们再配置一个<logger>:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="false" scanPeriod="60000" debug="false">
 
    <appender>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
    </appender>
   
    <logger additivity="false" />
    <logger level="warn">
        <appender-ref ref="STDOUT" />
    </logger>
   
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
   
</configuration>

如果读懂了上面的例子,那么这个例子应当很好理解:

LoggerFactory.getLogger(Object.class),首先找到name="java.lang"这个<logger>,将日志级别大于等于warn的使用"STDOUT"这个<appender>打印出来

name="java.lang"这个<logger>没有配置additivity,那么additivity=true,打印信息向上传递,传递给父级name="java"这个<logger>

name="java"这个<logger>的additivity=false且不关联任何<appender>,那么name="java"这个<appender>不会打印任何信息

由此分析,得出最终的打印结果为:

2018-03-27 23:12:16.147 [main] WARN  java.lang.Object - =====warn=====
2018-03-27 23:12:16.150 [main] ERROR java.lang.Object - =====error=====

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8e687584a611807a04e52a0779e5ff97.html