<logger>和<root>

<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>不会打印出任何信息。
原文地址:https://www.cnblogs.com/yourGod/p/9122834.html