slfj、log4j等通用日志框架及Spring5日志新特性

一、主流的log技术名词

  1. log4j
    可以不需要依赖第三方的技术
    直接记录日志
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

测试类:

import org.apache.log4j.Logger;

public class Log4j {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("Log4j");
        logger.info("log4j");
    }
}
  1. jul
    java自带的一个日志记录的技术,直接使用
    测试类:
import java.util.logging.Logger;

public class JUL {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger("JUL");
        logger.info("JUL");
    }
}
  1. jcl
    jakartaCommonsLoggingImpl
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>

测试类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JCL {
    public static void main(String[] args) {
        Log log = LogFactory.getLog("JCL");
        log.info("JCL");
    }
}

jcl他不直接记录日志,他是通过第三方记录日志(jul)
如果使用jcl来记录日志,在没有log4j的依赖情况下,是用jul
如果有了log4j则使用log4j

jcl=Jakarta commons-logging ,是apache公司开发的一个抽象日志通用框架,本身不实现日志记录,但是提供了记录日志的抽象方法即接口(info,debug,error…),底层通过一个数组存放具体的日志框架的类名,然后循环数组依次去匹配这些类名是否在app中被依赖了,如果找到被依赖的则直接使用,所以他有先后顺序。
在这里插入图片描述上图为jcl中存放日志技术类名的数组,默认有四个,后面两个可以忽略。
在这里插入图片描述
上图81行就是通过一个类名去load一个class,如果load成功则直接new出来并且返回使用。如果没有load到class这循环第二个,直到找到为止。
在这里插入图片描述可以看到这里的循环条件必须满足result不为空,
也就是如果没有找到具体的日志依赖则继续循环,如果找到则条件不成立,不进行循环了。
总结:顺序log4j>jul
在这里插入图片描述

  1. log4j2
  2. slf4j
    slf4j他也不记录日志,通过绑定器绑定一个具体的日志记录来完成日志记录
    在这里插入图片描述比如我要绑定log4j:
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <!--log4j绑定器-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.30</version>
        </dependency>

测试类:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SLF4J {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("SLF4J");
        logger.info("SLF4J");
    }
}

如果日志冲突,可以用桥接器解决:
在这里插入图片描述
6. logback
{logback.version} 1.2.2

    <!-- logback -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>${logback.version}</version>
    </dependency>
  1. simple-log

二、各种日志技术的关系和作用

在这里插入图片描述

三、spring日志技术分析

  1. spring5.*日志技术实现
    spring5使用的spring的jcl(spring改了jcl的代码)来记录日志的,
    但是jcl不能直接记录日志,底层用了switch来选择用不同的日志实现,默认选择JUL。
    在这里插入图片描述
    在这里插入图片描述
  2. spring4.*日志技术实现
    spring4当中依赖的是原生的jcl,采用循环优先的原则
发布了143 篇原创文章 · 获赞 49 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/weixin_36586564/article/details/104118944