SpringBoot之路SpringBoot极简教程 · Spring Boot 分布式微服务

012SpringBoot之日志深入介绍(下)

2018-05-29  本文已影响33人  编程界的小学生

一、简单看结构

1、结构图

1.1、对pom.xml鼠标右键

image.png

1.2、结构图

image.png

PS:看不清?没关系,自己去自己电脑上操作查看去。

二、具体分析

1、主要结构图

image.png

2、概括

我们可以从上图中看到,springboot依赖了spring-boot-starter,而spring-boot-starter依赖了spring-boot-starter-logging

所以大概是如下这样的:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
</dependency>

SpringBoot用如下这个依赖来做日志功能:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

3、继续分析结构图

image.png

4、总结

5、桥接jar?

5.1、jul-to-slf4j

image.png

5.2、log4j-over-slf4j

image.png
void differentiatedLog(Marker marker, String fqcn, int level, Object message, Throwable t) {
        String m = convertToString(message);
        if (locationAwareLogger != null) {
            locationAwareLogger.log(marker, fqcn, level, m, null, t);
        } else {
            switch (level) {
            case LocationAwareLogger.TRACE_INT:
                slf4jLogger.trace(marker, m);
                break;
            case LocationAwareLogger.DEBUG_INT:
                slf4jLogger.debug(marker, m);
                break;
            case LocationAwareLogger.INFO_INT:
                slf4jLogger.info(marker, m);
                break;
            case LocationAwareLogger.WARN_INT:
                slf4jLogger.warn(marker, m);
                break;
            case LocationAwareLogger.ERROR_INT:
                slf4jLogger.error(marker, m);
                break;
            }
        }
    }

PS:可以看到都是用的slf4jLogger来输出的日志。

5.3、jcl-over-slf4j

image.png
public abstract class LogFactory {
    static LogFactory logFactory = new SLF4JLogFactory();
}

PS:就问你尴尬不?底层new的是SLF4JLogFactory

5.4、总结

桥接jar就一招:偷梁换柱。jar包名都一样,只是做了个适配。

三、使用其他日志框架

1、使用其他日志框架

若我们使用的是非logback+slf4j的框架,则需要将此依赖移除掉,比如我们用的是log4j2

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2、疑问

问:SpringBoot底层是Spring,而Spring依赖的是commons-logging,那么SpringBoot没有剔除掉commons-logging吗?

答:当然剔除了!如下:

spring-boot-starter.pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

问:为什么一定要剔除掉呢?

答:我们上面分析过桥接jar,看到里面只是偷梁换柱,包名字都没换,这样一来,你在引入一个同包名的jar,不就冲突了吗?

3、总结

SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可。

四、广告

img
上一篇 下一篇

猜你喜欢

热点阅读