Spring Boot 日志级别及配置详解

 更新时间:2025年07月07日 09:12:53   作者:el psy congroo  
本文讲解SpringBoot日志核心:通过slf4j记录日志,支持多级别(INFO/DEBUG/TRACE)及配置输出格式、路径、分割策略,便于问题定位和数据分析,同时结合Lombok简化日志代码,强调日志持久化与安全审计的重要性,感兴趣的朋友一起看看吧

为什么要学习日志

最主要的原因就是发现和定位问题,或者根据日志来分析程序的运行过程。随着项目的复杂度提升,我们对日志的打印也有了更高的需求,而不仅仅是定位排查问题

比如需要记录一些用户的操作记录(一些审计公司会要求),也可能需要使用日志来记录用户的一些喜好,把日志持久化,方便后续进行数据分析等。也可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,设置不同的规则,超过阈值时进行报警

还有一些内部的违规和信息泄漏(比如客户信息被卖掉)现象出现后,如果未记录留存日志,为事后调查提供依据,那么后续很难追查(一些公司查看客户信息的操作都会记录日志,如果频繁查询也会报警)

日志使用

SpringBoot 内置了日志框架 slf4j,我们可以直接调用 slf4j 来输出日志

打印日志的步骤:

  1. 在程序中得到日志对象
  2. 使用日志对象输出要打印的内容

获取日志对象需要使用 LoggerFactory,如下代码所示:

private static final Logger logger = LoggerFactory.getLogger(XXX.class);

LoggerFactory.getLogger 需要传递一个参数,标识这个日志的名称。这样可以更清晰地知道是哪个类输出的日志。当有问题时,可以更方便直观地定位到问题类

注意 Logger 是属于 org.slf4j 包下的,不要导错包

我们先使用 info () 方法来输出日志,如下代码所示:

import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogController {
    private static final Logger logger = LoggerFactory.getLogger(LogController.class);
    @PostConstruct
    public void logger() {
        System.out.println("打印日志");
        logger.info("打印日志");
    }
}

打印日志效果展示:

可以看到 System.out.println 打印的日志,比 slf4j 打印的日志少了很多信息

日志级别

日志级别代表着日志信息对应问题的严重性, 为了更快地筛选符合目标的日志信息

日志级别的分类

日志的级别从高到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE

  1. FATAL:致命信息,表示需要立即被处理的系统级错误
  2. ERROR:错误信息,不影响系统的继续运行
  3. WARN:警告信息,不影响使用,但需要注意的问题
  4. INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等
  5. DEBUG:调试信息,需要调试时候的关键信息打印
  6. TRACE:追踪信息,比 DEBUG 更细粒度的信息事件 (除非有特殊用意,否则请使用 DEBUG 级别替代)

日志级别是开发人员自己设置的,根据开发人员自己的理解来判断该信息的重要程度,和测试人员的 Bug 级别没有关系

日志级别的使用

针对这些级别,Logger 对象分别提供了对应的方法来输出日志(除了fatal)

Spring Boot 默认集成的日志框架是 Logback。同时,Spring Boot 在日志方面还整合了 SLF4J(Simple Logging Facade for Java),SLF4J 并不是一个具体的日志实现框架,而是一个抽象的日志门面

SLF4J 提供了一套通用的接口规范,允许开发者在不修改应用代码中日志调用方式的前提下,灵活切换底层实际的日志实现框架,比如 Logback、Log4j 等。这就使得应用程序在不同的部署环境或基于不同的需求,可以轻松地更换日志实现,而无需大规模改动代码

在 Logback 中,虽然没有独立的 FATAL 日志级别,但由于 SLF4J 的存在,它可以将 SLF4J 定义的 FATAL 级别进行映射处理。具体来说,Logback 把 SLF4J 中的 FATAL 级别映射到了 ERROR 级别。这意味着,即使通过其他方式调用 FATAL ,最终也会被映射为 ERROR 级别

通过这种映射机制,即使 Logback 自身没有专门的 FATAL 级别,但依然能够和基于 SLF4J 的日志体系很好地兼容

@RestController
public class LogController {
    private static final Logger logger = LoggerFactory.getLogger(LogController.class);
    @PostConstruct
    public void printLog() {
        logger.error("error日志");
        logger.warn("warn日志");
        logger.info("info日志");
        logger.debug("debug日志");
        logger.trace("trace日志");
    }
}

发现只打印了error , warn 和 info 级别的日志。因为日志的输出级别默认是 info ,如果不进行任何配置,那么低于INFO级别的日志就不会打印

日志配置

配置日志级别

yml 配置

logging:
  level:
    root: debug

这样会将 所有包(包括 Spring 框架内部) 的日志级别都设置为 DEBUG,导致控制台输出大量框架层面的调试信息,影响排查效率

将 root 替换为自己代码中需要打印 DEBUG 日志的包路径,这样仅会启用指定包下的 DEBUG 日志,而 Spring 等其他依赖仍使用默认级别(通常是 INFO)

如果需要对不同包设置不同级别,可以这样配置:

logging:
  level:
    # 自定义业务包开启 DEBUG 级别日志
    org.example.j20250702: debug
    # Spring 框架内部日志,只打印 INFO 及更高级别
    org.springframework: info

配置日志持久化

以上的日志都是输出在控制台上的,然而我们常常需要把日志保存下来,以便出现问题之后追溯问题。把日志保存下来就叫持久化

日志持久化有两种方式

  1. 配置日志文件的路径和文件名:

yml 配置

logging:
  file:
    name: logger/springboot.log

后面可以跟绝对路径或者相对路径

运行结果显示,日志内容保存在了对应的目录下

  1. 配置日志文件的保存路径:

yml 配置

logging:
  file:
    path: log

后面可以跟绝对路径或者相对路径,但只能设置日志的路径,文件名固定为 spring.log

运行程序,该路径下多出一个日志文件: spring.log

logging.file.name 和 logging.file.path 两个都配置路径的情况下,只生效其一,以 logging.file.name 为准

配置日志文件分割

如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,所以有必要对日志文件进行分割

当然,日志框架也考虑到了这一点,所以如果不进行配置,默认日志文件超过 10MB 就进行分割

配置项说明默认值
logging.logback.rollingpolicy.file-name-pattern日志分割后的文件名格式${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size日志文件超过这个大小就自动分割10MB

yml配置日志文件分割:

logging:
  logback:
    rollingpolicy:
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
      max-file-size: 1KB
  file:
    path: log
  • 日志文件超过 1KB 就分割 (设置 1KB 是为了更好展示文件分割)
  • 分割后的日志文件名为:日志名.日期.编号(每日重置)

配置日志打印格式

目前日志打印的格式是默认的,我们可以进行配置,而且支持控制台和日志文件分别设置

配置项默认值
logging.pattern.console
(控制台日志格式)
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
logging.pattern.file
(日志文件的日志格式)
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

格式说明:

  1. %clr(表达式){颜色} :设置输入日志的颜色,支持颜色有以下几种:blue、cyan、faint、green、magenta、red、yellow

  2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间 —— 精确到毫秒

%d{}: 日期

${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX} :非空表达式,获取系统属性 LOG_DATEFORMAT_PATTERN , 若不存在,则使用 yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系统属性可以通过System.getProperty("LOG_DATEFORMAT_PATTERN") 获取

  1. %p 显示日志级别 ERROR,WARN,INFO,DEBUG,TRACE。
    %t 线程名。
    %c 类的全限定名。
    %M 方法名。
    %L 行号。
    %m 或者 %msg 显示输出消息。
    %n 换行符。
  2. %5 表示如果字符长度小于 5,则右边用空格填充。
    %-5 表示如果字符长度小于 5,则左边用空格填充。
    %.15 表示如果字符长度超过 15,截去多余字符。
    %15.15 表示如果字符长度小于 15,则右边用空格填充;若字符长度超过 15,截去多余字符。

更多说明,参考:https://logback.qos.ch/manual/layouts.html#conversionWord

yml配置

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c %M %L [%t] %m%n'
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c %M %L [%t] %m%n'

项目运行, 观察日志变化:

通常情况下,咱们就使用默认的日志打印格式即可

设置了颜色,却没有生效?

需要配置,让 idea 支持控制台颜色显示。打开启动配置,添加 VM options

在 VM options 中添加 -Dspring.output.ansi.enabled=ALWAYS

应用并重启程序

使用lombok提供的注解

每个类都添加一遍LoggerFactory.getLogger(xxx.class) 很繁琐,lombok 给我们提供了一种更简单的方式

  1. 添加 lombok 框架支持
  2. 使用 @slf4j 注解输出日志
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

lombok 提供的 @Slf4j 会提供一个日志对象 log, 我们直接使用就可以

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
    @PostConstruct
    public void logger() {
        log.info("打印日志");
    }
}

idea反编译的字节码是这样的

到此这篇关于Spring Boot 日志的文章就介绍到这了,更多相关Spring Boot 日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Flowable中定时器的玩法详解

    Flowable中定时器的玩法详解

    这篇文章主要为大家详细介绍了Flowable中定时器的各种玩法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-11-11
  • 手把手教你如何在idea中搭建SpringBoot项目

    手把手教你如何在idea中搭建SpringBoot项目

    这篇文章主要介绍了如何搭建一个SpringBoot项目,包括环境准备、创建新项目、探索项目结构以及展望未来,通过详细的步骤和实用的技巧,帮助开发者快速上手SpringBoot开发,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • Java服务调用失败报Service com.oneinfinite.adflow.api.service.TestService未找到的解决方法

    Java服务调用失败报Service com.oneinfinite.adflow.api.service.T

    在Java开发中,服务调用是常见的操作,尤其是在微服务架构中,然而,服务调用过程中可能会遇到各种问题,下面我们来看看如何解决Service com.oneinfinite.adflow.api.service.TestService with version 0.0.0 not found的问题吧
    2025-03-03
  • Java正则表达式循环匹配字符串方式

    Java正则表达式循环匹配字符串方式

    这篇文章主要介绍了Java正则表达式循环匹配字符串方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java如何替换jar中的class文件

    Java如何替换jar中的class文件

    在调整java代码过程中会遇到需要改jar包中的class文件的情况,改了如何替换呢?下面小编给大家分享java替换jar中的class文件的操作方法,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Spring Boot热加载jar实现动态插件的思路

    Spring Boot热加载jar实现动态插件的思路

    本文主要介绍在 Spring Boot 工程中热加载 jar 包并注册成为 Bean 对象的一种实现思路,在动态扩展功能的同时支持在插件中注入主程序的 Bean 实现功能更强大的插件
    2021-10-10
  • Mybatis分页插件Pagehelper的PageInfo字段属性使用及解释

    Mybatis分页插件Pagehelper的PageInfo字段属性使用及解释

    这篇文章主要介绍了Mybatis分页插件Pagehelper的PageInfo字段属性使用及解释,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java 常量与变量的区别详细介绍

    Java 常量与变量的区别详细介绍

    这篇文章主要介绍了Java 常量与变量的区别的相关资料,并附实例代码帮助大家学习理解,需要的朋友可以参考下
    2016-10-10
  • Kotlin 和 Java 混合开发入门教程

    Kotlin 和 Java 混合开发入门教程

    这篇文章主要介绍了入门 Kotlin 和 Java 混合开发,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 一文解读Spring Bean的生命周期

    一文解读Spring Bean的生命周期

    这篇文章主要给大家详细解读Spring Bean的生命周期,文中有详细的代码示例,对我们学习Spring Bean的生命周期有一定的帮助,感兴趣的同学跟着小编一起来学习吧
    2023-07-07

最新评论