logback中logger详解_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

媒介

logback实践条记

​ 上一篇主要对root举行了实践总结,如今基于上一篇中的springboot代码情况对logback.xml中的logger来举行实践和本身碰到的坑。

logger简介

​ 日记属性,能够依据logger中的name属性指定某个文件或许文件夹输出的日记级别,并经由过程appender-ref指定日记的输出花样。另有一个additivity属性,若是设置为false的话就不会向上通报。

上代码

logback.xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
    <appender name="logger_stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{YYYY-MM-dd HH:mm:ss} | %-5level | %thread | %logger - %msg%n</Pattern>
        </encoder>
    </appender>
    <!-- name=指定打印日记文件级别 level=日记级别 additivity=是不是想向上通报 先不加上 additivity=false 属性 -->
    <logger name="com.example.logback.logger" level="info">
        <!-- 指定输出的appender -->
        <appender-ref ref="logger_stdout"/>
    </logger>
</configuration>

测试代码:

package com.example.logback.logger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @ClassName LoggerTest
 * @Description TODO
 * @Author ouyangkang
 * @Date 2019-01-07 17:04
 **/
@Component
public class LoggerTest {

    private final Logger logger = LoggerFactory.getLogger("测试");

    public void loggerTest() {
        logger.info("info=====>");
        logger.error("error====》");
        logger.debug("debug=====》");
    }
}

单元测试代码:

package com.example.logback;

import com.example.logback.logger.LoggerTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class LogbackApplicationTests {
    @Resource
    private LoggerTest loggerTest;
    @Test
    public void loggerTest(){
        loggerTest.loggerTest();
    }

}

输出效果以下,图一

图一

看到了没有,并没有任何的输出。

剖析

​ 本身看到上面输出的效果也是很懵逼的,细致检察了logback.xml中的代码,logger中的name指定的是本身测试代码的包啊,日记级别是info。怎样就啥都没输出啊。appender中的设置装备摆设也没错啊。现在本身是找了良久的毛病都没有找出来。

测试代码

​ 起首检察本身写的测试代码,本身对 private final Logger logger = LoggerFactory.getLogger("测试");这行代码产生了疑心,这个logger形参指定的是哪个日记框架中的工具。因而本身修正上面的测试代码以下

public class LoggerTest {
    public void loggerTest() {
        Logger logger = LoggerFactory.getLogger("测试");
        logger.info("info=====>");
        logger.error("error====》");
        logger.debug("debug=====》");
    }
}

对logger logger = LoggerFactory.getLogger("测试"); 这行代码举行debug。进入了,如图二

图二

​ getLogger要领是slf4j中猎取logger工场,检察getILoggerFactory()要领,发明实在他就是猎取一个详细的loggerFactory工场,看过笼统工场设想形式的应当就晓得了。这里因为我们是新建了logback.xml,那末返回的工场类实在就是logback-classic中的LoggerContext。然后挪用getLogger要领建立一个Logger工具。发明返回的Logger工具以下 图三

图三

此时我们继承跟进logger.info。找到最症结的代码,如图四

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。- 图四

​ 该症结代码在logback-classic中的Logger类中,依据这个callAppenders要领名能够晓得这就是打印日记的症结要领,继承跟进,检察callAppenders要领。如图五

图五

这个划重点了,细致看,这个for轮回中,能够看出来257行就是打印这个日记的代码了。然则这个Logger l = this; 这个代码是症结。这个this就是工具就是我们依据LoggerFactory.getLogger("测试")猎取到的。继承跟进appendLoopOnAppenders要领。如图六

图六

发明是aai来打印这行日记,那末aii是怎样打印这行日记的呢,这个就要回到一开始logback.xml设置装备摆设的处所了,本身设置装备摆设了测试代码下的日记输出花样,然则没有设置装备摆设一个logger.name 叫做”测试“的包下面的日记输出花样啊。因而本身修正logback.xml中的代码以下

<?xml version="1.0" encoding="utf-8" ?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
    <appender name="logger_stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{YYYY-MM-dd HH:mm:ss} | %-5level | %thread | %logger - %msg%n</Pattern>
        </encoder>
    </appender>
    <!-- name=指定打印日记文件级别 level=日记级别 additivity=是不是想向上通报 先不加上 additivity=false 属性 -->
    <logger name="测试" level="info">
        <!-- 指定输出的appender -->
        <appender-ref ref="logger_stdout"/>
    </logger>
</configuration>

运转单元测试,得出效果以下图七

图七

有了日记输出。

思索

​ 我看公司代码一样平常猎取日记工具都是 private final Logger logger = LoggerFactory.getLogger(this.getClass()); 然后logback.xml中的logger属性中name都是指定某一包名。实在这里本身跟代码跟了挺久了个中在图五中谁人for轮回就是一向向上查找,logback.xml是不是设置了有该包下的日记输出花样。若是查找到有该输出花样就输出,并检察logback.xml中logger中你是不是设置了additivity。不是这就是默许true,继承向上查找是不是另有分歧的输出花样。若是设置为false,就完毕。

我举一个例子吧如许就很好理解了

logback.xml代码以下

<?xml version="1.0" encoding="utf-8" ?>
<!-- debug=是不是打印logback内部日记 scan=是不是从新加载  scanPeriod=多久扫描一次 -->
<configuration debug="true" scan="true" scanPeriod="60 seconds">
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{YYYY年MM月dd日 HH:mm:ss} | %-5level | %thread | %logger - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="logger_stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{YYYY-MM-dd HH:mm:ss} | %-5level | %thread | %logger - %msg%n</Pattern>
        </encoder>
    </appender>

    <!-- 指定name 在该aa.bb.cc 下的日记输出花样 这个就是在aa.bb.cc.dd 上的日记输出花样-->
    <logger name="aa.bb.cc" level="info">
        <!-- 指定输出的appender -->
        <appender-ref ref="logger_stdout"/>
    </logger>
    <!-- 指定name 在该aa.bb.cc.dd 下的日记输出花样 additivity 默许为true 能够向上通报-->
    <logger name="aa.bb.cc.dd" level="info" >
        <appender-ref ref="stdout"/>
    </logger>
</configuration>

测试代码以下

package com.example.logback.logger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @ClassName LoggerTest
 * @Description TODO
 * @Author ouyangkang
 * @Date 2019-01-07 17:04
 **/
@Component
public class LoggerTest {
    private final Logger logger = LoggerFactory.getLogger("aa.bb.cc.dd.ee");
    public void loggerTest() {
        logger.info("info=====>");
        logger.error("error====》");
        logger.debug("debug=====》");
    }
}

单元测试代码如 上代码内里的单元测试代码一样。

获得效果以下:

图八

总结

​ LoggerFactory.getLogger(name),个中name对应着logback.xml中logger属性中name=对应的子包,固然你也能够设置一样的。logger中的additivity设置为false是代表该logger日记打印不向上通报, appender-ref指定的日记输出花样。

​ 下一篇把logback.xml中的appender属性引见一下并举行实践。

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。