Spring Boot学习教程(二)

226 阅读4分钟

Spring Boot学习教程(二)

3. Spring Boot与日志

3.1 日志框架

市面上常用的的日志框架:

日志门面(日志的抽象层)日志实现
JCL()、SLF4J()、jboss-loggingLog4J、JUL()、Log4J2、Logback

当我们要使用完整的日志框架功能时,我们只需要选一个日志门面 + 一个日志实现的组合即可 如:SLF4J + Logback

一般的,Spring框架默认使用JCL门面;Spring Boot默认使用的是SLF4J + Logback

3.2 SLF4J的使用

3.2.1 如何在系统中使用SLF4J

slf4j官网的用户手册

给系统里导入slf4j的jar包和logback的实现jar包

//打印日志

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

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

除了slf4j + logback的组合,其他组合情况使用slf4j的时候,需要这样导包:

0m1cAs.png

每个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件依旧是只为日志实现框架本身而编写

3.2.2 统一其他日志框架为slf4j

假设系统A(使用slf4j + logback)使用了Spring框架(使用的是commons-logging日志门面)和Hibernate框架(使用的是jboss-logging日志门面),于是系统A内部日志框架不统一,非常混乱。 所以,我们就需要进行日志记录的统一,也就是说,即使是使用了别的框架,也能统一使用slf4j进行输出

0m8mz6.png

看图总结:

如何让系统中所有的日志都统一到slf4j呢?

  1. 先将系统中其他日志框架排除出去
  2. 用中间包来替换原有的日志框架
  3. 最后再导入slf4j其他的实现

3.3 Spring Boot日志关系

0mYZJs.png

0mJEgx.png


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.3.4.RELEASE</version>
    <scope>compile</scope>
</dependency>


<!-- Spring Boot使用它来实现日志功能 -->

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

Spring Boot日志底层依赖关系:

0mUNSs.png

总结:

  1. Spring Boot底层也使用slf4j + logback的方式进行日志记录
  2. Spring Boot也把其他的日志都替换成了slf4j
  3. 中间替换包:

BPFUjP.png

jul-to-slf4j-1.7.30.jar为例,其中的SLF4JBridgeHandler类:


public static void install() {
    LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
}

  1. 如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除,否则会导致jar包冲突

3.4 Spring Boot日志使用

3.4.1 默认配置及其修改

Spring Boot默认帮我们配置好了日志


package com.taotao.springboot0;

import org.junit.jupiter.api.Test;
import org.junit.platform.commons.logging.Logger;
import org.junit.platform.commons.logging.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
class SpringBoot03LoggingApplicationTests {

    //记录器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    void contextLoads() {

        //日志的级别:由低到高:trace < debug < info < warn < error
        //可以调整需要输出的日志级别
        logger.trace(()->"这是trace日志");
        logger.debug(()->"这是debug日志");
        logger.info(()->"这是info日志");
        logger.warn(()->"这是warn日志");
        logger.error(()->"这是error日志");
    }
}

测试结果:

0nAPvn.png

由此可见,Spring Boot默认使用 info 级别的日志

不过我们可以手动调整输出的日志级别,调整以后高于该日志级别的才会生效:

0nVi7V.png

0nVmc9.png

logging.file.namelogging.file.pathexample说明
(none)(none)只在控制台输出
指定文件名(none)my.log输出日志到my.log文件
(none)指定目录/var/log输出到指定目录的spring.log文件中

举几个例子:


# 在当前磁盘的根目录下创建spring文件夹和里面的log文件夹,使用spring.log作为默认文件名
logging.file.path=/spring/log


# 在当前项目下(或指定路径下)生成springboot.log日志文件
logging.file.name=springboot.log

运行结果:

0n3N0e.png

通过修改配置文件来修改日志的格式:


# 在当前磁盘的根目录下创建spring文件夹和里面的log文件夹,使用spring.log作为默认文件名
logging.file.path=/spring/log

# 在当前项目下(或指定路径下)生成springboot.log日志文件
#logging.file.name=springboot.log


# 指定在控制台输出的日志的格式
# %d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50} - %msg%n
# 原来的格式:日期&时间 + 线程名 + 级别 + logger的全类名 + 日志消息 + 换行
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n

# 指定在文件中输出的日志的格式
logging.pattern.file=%d{yyyy-MM-dd} ====== [%thread] ====== %-5level %logger{50} - %msg%n

运行结果:

0n3G6K.png

0n3wtA.png

0n3cnS.png

3.4.2 用户指定配置

给类路径下放入每个日志框架自己的配置文件即可,Spring Boot便会不使用其默认配置

日志框架对应的指定配置文件
logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
log4j2log4j2-spring.xml, log4j2.xml
JDK(Java Util Logging)logging.properties

如果使用的是 logback.xml ,会直接被日志框架识别 而使用 logback-spring.xml 的话,日志框架就不会直接加载日志的配置项,而是由Spring Boot解析日志配置,因而可以使用Spring Boot的 springProfile 高级功能


<springProfile name="dev">
    <!-- 可以指定某段配置只在某个环境下生效 -->
</springProfile>

3.5 切换日志框架

可以按照slf4j的日志适配图,进行相关的切换:

0m8mz6.png

举个例子:从 slf4j + log4j 切换到 slf4j + log4j2

slf4j + log4j


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>



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>




Spring Boot入门介绍部分到此结束!接下来就开始实战的部分(Web开发)!敬请期待!