<logger>用来设置某一个包或者具体一个类的日志打印级别、以及制定<appender>。<logger>可以包含零个或者多个<appender-ref>元素,标识这个appender将会添加到这个logger。<logger>仅有一个name属性、一个可选的level属性和一个可选的additivity属性:
1、name:用来指定受此logger约束的某一个包或者具体的一个类。
2、level:用来设置打印级别,五个常用打印级别从低到高一次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么logger将会继承上级的级别。
3、additivity:是否向上级logger传递打印信息,默认为true。
<root>也是<logger>元素,但它是根logger,只有一个level属性,因为它的name就是ROOT,具体可看源码LoggerContext:
public LoggerContext() { super(); this.loggerCache = new ConcurrentHashMap<String, Logger>(); this.loggerContextRemoteView = new LoggerContextVO(this); this.root = new Logger(Logger.ROOT_LOGGER_NAME, null, this); this.root.setLevel(Level.DEBUG); loggerCache.put(Logger.ROOT_LOGGER_NAME, root); initEvaluatorMap(); size = 1; this.frameworkPackages = new ArrayList<String>(); }
Logger的构造函数为:
Logger(String name, Logger parent, LoggerContext loggerContext) {
this.name = name;
this.parent = parent;
this.loggerContext = loggerContext;
}
将logback.xml配置为:
<?xml version="1.0" encoding="UTF-8" ?> <configuration scan="false" scanPeriod="60000" debug="false"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </layout> </appender> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration>
root将打印级别设置为“info”级别,<appender>暂时不管
编写代码来测试:
public class Slf4jTest {
@Test
public void testSlf4j() {
Logger logger = LoggerFactory.getLogger(Object.class);
logger.trace("=====trace=====");
logger.debug("=====debug=====");
logger.info("=====info=====");
logger.warn("=====warn=====");
logger.error("=====error=====");
}
}
控制台的输出:
logback.xml的意思是,当Test方法运行时,root节点将日志级别大于等于info的交给已经配置好的名为"STDOUT"的<appender>进行处理,"STDOUT"将信息打印到控制台上。
<logger>节点的作用,logback.xml修改后,加入一个只有name属性的<logger>:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <configuration scan="false" scanPeriod="60000" debug="false"> 3 4 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 5 <layout class="ch.qos.logback.classic.PatternLayout"> 6 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> 7 </layout> 8 </appender> 9 10 <logger name="java" /> 11 12 <root level="debug"> 13 <appender-ref ref="STDOUT" /> 14 </root> 15 16 </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=====
出现逾期结果的原因:
1、<logger>中没有配置level,即继承父级的level,<logger>的父级为<root>,那么level=debug
2、没有配置additivity,那么additivity=true,表示此<logger>的打印信息向父级<root>传递
3、没有配置<appender-ref>,表示此<logger>不会打印出任何信息。