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=====