Java日志框架 -- SpringBoot中的日志使用

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日志框架 -- SpringBoot中的日志使用相关的知识,希望对你有一定的参考价值。

1. SpringBoot中的日志使用

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

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


1.1 SpringBoot中的日志设计

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

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

    <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>

我们来查看依赖关系图:

总结:

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

1.2 SpringBoot日志使用


1.2.1 在springboot中测试打印日志

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");
    

运行结果:


1.2.2 修改默认日志配置

application.properties

# 指定自定义 logger 对象日志级别
logging.level.com.itheima=trace
# 指定控制台输出消息格式
logging.pattern.console=[%-5level] %dyyyy-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] %dyyyy-MM-dd HH:mm:ss %c [%thread] --  %msg %n

运行结果:


1.2.3 指定配置

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

示例:

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

现在加上logback.xml配置文件

logback.xml

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

    <!--
        配置集中管理属性
        我们可以直接改属性的 value 值
        格式:$name
    -->
    <property name="pattern" value="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS %c %M %L [%thread] %m%n"/>
    <!--
    日志输出格式:
        %-5level
        %dyyyy-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>

运行结果:


1.2.4 使用SpringBoot解析日志配置

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

示例:

logback-spring.xml

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

    <!--
        配置集中管理属性
        我们可以直接改属性的 value 值
        格式:$name
    -->
    <property name="pattern" value="[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS %c %M %L [%thread] %m%n"/>
    <!--
    日志输出格式:
        %-5level
        %dyyyy-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>%dyyyyMMdd: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>

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


1.2.5 将日志切换为log4j2

现在的依赖为:

    <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>

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

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

补充知识:怎么排除依赖



以上是关于Java日志框架 -- SpringBoot中的日志使用的主要内容,如果未能解决你的问题,请参考以下文章

Java日志框架 -- SpringBoot中的日志使用

Java日志框架 -- SpringBoot中的日志使用

Java日志框架与日志系统

Java中的日志框架

MyBatis 源码篇-日志模块1

springboot-日志框架