zoukankan      html  css  js  c++  java
  • <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>不会打印出任何信息。
  • 相关阅读:
    (React 框架)React技术
    React 项目
    JS语法之--模块化
    JS 语法之-- 解构,Promise(异步)
    JS 语法之--对象类型(构造器,class,this),高阶对象(高阶类,Minix模式)
    javascript:console对象与控制台
    javascript:错误处理
    javascript:基本数据类型转换
    javascript:数据结构-数组
    javascript:数据结构-对象
  • 原文地址:https://www.cnblogs.com/yourGod/p/9122834.html
Copyright © 2011-2022 走看看