1. SpringBoot中的日志使用

springboot框架在企业中的使用越来越普遍,springboot日志也是开发中常用的日志系统。springboot默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志。

不懂日志框架和日志门面的请查看这篇文章


1.1 SpringBoot中的日志设计

我们先创建一个SpringBoot的项目:

springboot 日志框架原理 springboot支持日志框架_spring boot

这是项目中的依赖:没有导入额外的依赖

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

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

我们来查看依赖关系图:

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_02

springboot 日志框架原理 springboot支持日志框架_开发语言_03

总结:

  1. springboot 底层默认使用logback作为日志实现。
  2. 使用了SLF4J作为日志门面
  3. 将JUL也转换成slf4j
  4. 也可以使用log4j2作为日志门面,但是最终也是通过slf4j调用logback

1.2 SpringBoot日志使用


1.2.1 在springboot中测试打印日志

springboot 日志框架原理 springboot支持日志框架_日志_04

LogsSpringbootApplicationTests.java

package com.tian;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class LogsSpringbootApplicationTests {
    // 声明日志记录器对象
    public static final Logger LOGGER = LoggerFactory.getLogger(LogsSpringbootApplicationTests.class);

    @Test
    void contextLoads() {
        // 打印日志信息
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info"); // 默认日志级别
        LOGGER.debug("debug");
        LOGGER.trace("trace");
    }
}

运行结果:

springboot 日志框架原理 springboot支持日志框架_spring boot_05


1.2.2 修改默认日志配置

springboot 日志框架原理 springboot支持日志框架_日志_06

application.properties

# 指定自定义 logger 对象日志级别
logging.level.com.itheima=trace
# 指定控制台输出消息格式
logging.pattern.console=[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] %msg -- %n
# 指定存放日志文件的具体路径 file.path和file属性不可以同时出现,不然file会覆盖file.path
# logging.file=/logs/springboot.log
# 指定日志文件存放的目录,默认的文件名 spring.log
logging.file.path=c:/logs/springboot/
# 指定日志文件消息格式
logging.pattern.file=[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c [%thread] --  %msg %n

运行结果:

springboot 日志框架原理 springboot支持日志框架_java_07

springboot 日志框架原理 springboot支持日志框架_开发语言_08


1.2.3 指定配置

给类路径下放上每个日志框架自己的配置文件,SpringBoot就不使用默认配置的了。

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_09

示例:

因为SpringBoot默认使用的Logback日志框架,所以我们在类路径下放上logback.xml配置文件即可被识别:

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_10

现在加上logback.xml配置文件

springboot 日志框架原理 springboot支持日志框架_java_11


logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理属性
        我们可以直接改属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
    <!--
    日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
      -->
    <!--定义日志文件保存路径属性-->
    <property name="log_dir" value="c:/logs"/>


    <!--控制台日志输出的 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 改为 System.err-->
        <target>System.err</target>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件输出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日志文件保存路径-->
        <file>${log_dir}/logback.log</file>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--root logger 配置-->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
</configuration>

运行结果:

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_12

springboot 日志框架原理 springboot支持日志框架_java_13


1.2.4 使用SpringBoot解析日志配置

springboot 日志框架原理 springboot支持日志框架_日志_14

logback-spring.xml:由SpringBoot解析日志配置

示例:

springboot 日志框架原理 springboot支持日志框架_java_15

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理属性
        我们可以直接改属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
    <!--
    日志输出格式:
        %-5level
        %d{yyyy-MM-dd HH:mm:ss.SSS}日期
        %c类的完整名称
        %M为method
        %L为行号
        %thread线程名称
        %m或者%msg为信息
        %n换行
      -->
    <!--定义日志文件保存路径属性-->
    <property name="log_dir" value="c:/logs"/>


    <!--控制台日志输出的 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 改为 System.err-->
        <target>System.err</target>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件输出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日志文件保存路径-->
        <file>${log_dir}/logback.log</file>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <springProfile name="dev">
                <pattern>${pattern}</pattern>
            </springProfile>
            <springProfile name="pro">
                <pattern>%d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n</pattern>
            </springProfile>
        </encoder>
    </appender>

    <!--root logger 配置-->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
</configuration>

springboot 日志框架原理 springboot支持日志框架_spring boot_16

怎么选择是开发(dev)还是生产(pro)环境呢?

springboot 日志框架原理 springboot支持日志框架_开发语言_17


1.2.5 将日志切换为log4j2

springboot 日志框架原理 springboot支持日志框架_spring boot_18

现在的依赖为:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions> <!--排除logback-->
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 添加log4j2 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_19

然后我们把日志的配置文件换成log4j2的配置文件

springboot 日志框架原理 springboot支持日志框架_springboot 日志框架原理_20

接下来运行上面的测试代码即可看到运行结果:

springboot 日志框架原理 springboot支持日志框架_spring boot_21

补充知识:怎么排除依赖

springboot 日志框架原理 springboot支持日志框架_日志_22