Spring全家桶中的日志框架

Spring全家桶中的日志框架

spring-jcl

spring-jcl是spring的日志框架,spring-jcl底层使用的日志框架是有优先级的优先级为:LOG4J2 级是最高的,其次是SLF4J (>=1.3)、SLF4J(<1.3)、JUL

根据spring-jcl中的LogAdapter可以得知,选择哪个日志框架是根据优先级来选定底层的日志框架的。

当项目里面没有其他日志框架时,默认使用Java提供的JUL(java.util.logging包)。

private static final String LOG4J_SPI = "org.apache.logging.log4j.spi.ExtendedLogger";

private static final String LOG4J_SLF4J_PROVIDER = "org.apache.logging.slf4j.SLF4JProvider";

private static final String SLF4J_SPI = "org.slf4j.spi.LocationAwareLogger";

private static final String SLF4J_API = "org.slf4j.Logger";


private static final LogApi logApi;

static {
    if (isPresent(LOG4J_SPI)) {
        if (isPresent(LOG4J_SLF4J_PROVIDER) && isPresent(SLF4J_SPI)) {
            // log4j-to-slf4j bridge -> we'll rather go with the SLF4J SPI;
            // however, we still prefer Log4j over the plain SLF4J API since
            // the latter does not have location awareness support.
            logApi = LogApi.SLF4J_LAL;
        }
        else {
            // Use Log4j 2.x directly, including location awareness support
            logApi = LogApi.LOG4J;
        }
    }
    else if (isPresent(SLF4J_SPI)) {
        // Full SLF4J SPI including location awareness support
        logApi = LogApi.SLF4J_LAL;
    }
    else if (isPresent(SLF4J_API)) {
        // Minimal SLF4J API without location awareness support
        logApi = LogApi.SLF4J;
    }
    else {
        // java.util.logging as default
        logApi = LogApi.JUL;
    }
}

spring-boot-starter-logging

spring-boot-starter-logging是spring boot的一个默认日志启动器,许多spring-boot启动器中都使用spring-boot-starter-logging作为日志实现,让你可以快速在spring-boot中引入的日志功能,而不用选择Java默认提供的JUL。

许多的springboot启动器都使用了spring-boot-starter-logging,如:spring-boot-starter,spring-boot-starter-web

spring-boot-starter-logging底层使用logback做为底层日志框架,spring-boot-starter-logging本身并没有实现日志功能,只不过是导入了一系列的日志API和logback日志框架

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

spring-boot-starter-log4j2

如果你想在springboot中使用log4j2,可以使用spring-boot-starter-log4j2去导入log4j2。

如果你想替换掉spring-boot-starter的默认日志框架,可以通过导入spring-boot-starter-log4j2,移除spring-boot-starter-logging来实现底层框架的更换。

更换spring-boot-starter底层日志框架时,记得移除spring-boot-starter-logging,否则Lombok会抛出Class path contains multiple SLF4J bindings警告。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.2.5.RELEASE</version>
    <!--移除spring-boot-starter-logging-->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--导入spring-boot-starter-log4j2-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <version>2.5.4</version>
</dependency>

springboot项目中使用Lombok的slf4j

如果你在springboot项目中使用Lombok的@Slf4j注解来生成log类,那么默认使用的是spring-boot-starter-logging里面的logback。(以为spring-boot-starter默认引入logback)

当项目存在多个slf4j日志接口的实现框架,会抛出Class path contains multiple SLF4J bindings警告。此时应该要主要是否引入复数的slf4j日志接口的实现框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值