在 Spring 开发中 , 日志是排查问题 , 监控系统 , 数据采集的核心工具 , 相比于原生的 System.out.print , 专业的日志框架能提供丰富的信息和配置
本文将从日志的核心用途出发 , 详细讲解 Spring Boot 内置日志框架的使用 , 配置及优化技巧 , 帮助开发者快速掌握日志的实战应用
一.为什么需要专业的日志框架
日志并非只是简单的打印信息 , 随着项目复杂程度的提升 , System.out.print 的局限性愈发明显 : 无法分级输出 , 不能持久化储存 , 缺少上下文信息
专业的日志框架能满足企业级开发的多重需求 , 核心用途分为三类 :
- 系统监控 : 记录系统运行状态 , 方法响应时间/状态 , 通过分析日志设置阈值报警 , 即使发现系统异常
- 数据采集 : 统计页面 PV/UV , 用户点击量等运行数据 , 或记录用户浏览/停留行为 , 为推荐排序 , 算法建模提供原始数据
- 日志审计 : 满足国家政策和行业标准的安全要求 , 记录用户操作行为 , 追溯非法攻击 , 数据修改/删除 , 信息泄露等问题 , 定位操作负责人
二.Spring Boot 日志基础使用
Spring Boot 启动时会默认输出控制台日志,包含时间、日志级别、进程 ID 等关键信息,这与System.out.print的纯文本输出有本质区别
1. 通过 SLF4J 快速实现自定义日志打印
核心步骤 :
- 获取日志对象 : 通过 **LoggerFactory.getLogger(类名.class)**获取 , 归属于(org.slf4j 包)
- 输出日志内容 : 通过日志对象的 info()等方法打印日志
java
package com.boop.logger.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/LoggerController")
@RestController
public class LoggerController {
//获取日志对象
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger(){
//输出日志
logger.info("-------- -------- 自定义日志 -------- --------");
return "打印日志";
}
}
2. 日志框架的设计:门面模式
SLF4J 并非真正的日志实现,而是日志门面(外观模式),它定义了日志的统一 API 接口,底层可对接 Logback、Log4j、JUL 等具体日志实现。这种设计解决了多日志框架共存的痛点:
- 无门面模式:项目若同时依赖 Log4j 和 Logback,需维护多套配置文件,更换框架还需修改代码;
- 有门面模式:应用程序仅与 SLF4J 交互,底层实现可灵活切换,且只需维护一套配置,实现了代码与具体日志实现的解耦。
门面模式的核心是提供统一的高层接口,隐藏子系统的复杂实现,类似医院的接待员,统一处理挂号、门诊、取药等流程,让患者无需对接多个部门,大幅降低使用成本
三.日志格式与日志级别
1. 日志格式详解
Spring Boot 默认的日志输出包含 6 个核心元素,能完整呈现运行上下文,格式示例:
2023-09-21 11:40:28.577 INFO 21484 --- [main] com.example.demo.SpringIocApplication : No active profile set
各元素含义:
- 时间日期:精确到毫秒,便于追溯问题发生时间
- 日志级别:ERROR、WARN、INFO、DEBUG、TRACE 等
- 进程 ID:当前应用的进程编号
- 线程名:执行日志打印的线程,如
main主线程、请求处理线程nio-8080-exec-1- Logger 名:通常为日志所在的类全限定名
- 日志内容:自定义的业务 / 调试信息
2. 日志级别分类与使用
日志级别代表信息的严重性和重要性,从高到低依次为:FATAL > ERROR > WARN > INFO > DEBUG > TRACE,级别越高,输出的日志越少,便于筛选关键信息。各层级含义 :
- FATAL : 致命错误 , 系统级不可用 , 需紧急介入(Logback 中映射到 ERROR)
- ERROR : 业务错误 , 不影响系统整体运行 , 但需修复
- WARN : 警告信息 , 如非必要的异常 , 潜在风险 , 无需立即处理
- INFO : 普通运行信息 , 如系统启动 , 接口调用完成 , 默认输出级别
- DEBUG : 调试信息 , 开发阶段打印关键变量 , 流程节点
- TRACE : 追踪信息 , 比 DEBUG 更细粒度 , 一般开发中很少使用
日志对象提供了与级别对应的打印方法 (logger.error()/logger.warn()等) , SpringBoot 默认开启 INFO 级别 , 因此只会输出 INFO/WARN/ERROR 级别的日志 , 低于 INFO 的 DEBUG/TRACE 会被过滤
四.Spring Boot 日志核心配置
Spring boot 支持通过 application.prooperties 或 application.yml 配置日志 , 覆盖默认行为 , 核心配置包括 : **日志级别 , 持久化 , 文件分割 , 日志格式 ,**满足线上环境的多样化需求
1. 配置日志级别
通过 logging.level 配置 , 可全局配置(root) 或针对特定包 / 类单独配置 , 优先级 : 类配置>包配置>全局配置
后面的配置中 只需要配置 properties 和 yml 中的一种即可
java
package com.boop.logger.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/LoggerController")
@RestController
public class LoggerController {
//获取日志对象
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/logger")
public String logger(){
//输出日志
System.out.println("sout打印日志");
logger.info("logger 打印日志");
logger.trace("logger trace...");
logger.debug("logger debug...");
logger.info("logger info...");
logger.warn("logger warn...");
logger.error("logger error...");
return "打印日志";
}
}
http://127.0.0.1:8080/LoggerController/logger
默认的日志级别
Properties 配置:properties
全局日志级别设为DEBUG
logging.level.root=debug
特定包日志级别设为INFO
logging.level.com.example.demo=info
Yml 配置:yml
logging:
level:
root: debug
com.example.demo: info
配置其中一个后 :
配置为 DEBUG 后 , 控制台会输出 DUBUG/INFO/WARN/ERROR 所有级别日志 , 便于开发调试
2. 日志持久化
线上环境中 , 控制台日志无法存留 , 需要将日志保存到文件(持久化) , 有两种篇日志方式 , logging.file.name 优先级高于 logging.file.path
2.1 配置日志文件名(支持绝对 / 相对路径)
Properties:
logging.file.name=logger/springboot.logYml:
logging:
file:
name: logger/springboot.log
2.2 配置日志存储目录 :文件名将固定为
spring.log
Properties:
logging.file.path=E:\Java code\java\260301\logger\src\main\java\com\boop\loggerYml
logging:
file:
path: E:\Java code\java\260301\logger\src\main\java\com\boop\logger
配置其中一项即可
2.3日志文件分割
日志文件会随项目运行持续增大,过大的日志文件难以打开和分析,因此需要按大小分割,Spring Boot 默认日志超过 10MB 自动分割,也可自定义配置。核心配置项:
表格
|-------------------------------------------------|----------|----------------------------------|
| 配置项 | 说明 | 默认值 |
| logging.logback.rollingpolicy.file-name-pattern | 分割后文件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
| logging.logback.rollingpolicy.max-file-size | 日志文件分割阈值 | 10MB |
- properties :
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i logging.logback.rollingpolicy.max-file-size=1KB
yml :
logback:
rollingpolicy:
# 分割后文件名:springboot.log.2023-09-21.0
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
# 超过5KB分割
max-file-size: 5KB
- 自定义配置示例 :
2.4 配置日志格式 (了解)
支持分别配置控制台日志格式 和文件日志格式 ,核心配置项为
logging.pattern.console和logging.pattern.file,常用的格式占位符:
%d{格式}:时间日期,如%d{yyyy-MM-dd HH:mm:ss.SSS}%p:日志级别%t:线程名%c:类全限定名%M:方法名%L:行号%m:日志内容%n:换行符
自定义格式示例(Yml):
-
yml
logging:
pattern:
# 控制台日志格式:时间 级别 类 方法 线程 内容
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c %M [%t] %m%n'
# 文件日志格式:增加进程ID
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} ${PID:-} %5p %c [%t] %m%n'
控制台日志颜色生效配置
默认情况下,日志颜色可能不生效,需在 IDEA 中添加 VM 参数:-Dspring.output.ansi.enabled=ALWAYS,步骤:
- 打开 Run/Debug Configurations;
- 在 VM options 中添加上述参数;
- 重启应用,控制台日志即可显示彩色(ERROR 红色、WARN 黄色、INFO 绿色等)。
通常情况下使用默认日志打印格式即可
五.更简洁的日志输出 : Lombok @Slf4j
每次通过LoggerFactory.getLogger()获取日志对象过于繁琐,Lombok 提供了@Slf4j注解,可自动生成日志对象log,直接使用即可,大幅简化代码
1.步骤 1 : 添加 Lombok 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.步骤 2 : 使用@Slf4j 注解输出日志
java
package com.boop.logger.Controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/log2")
@Slf4j
public class LoggerController2 {
@RequestMapping("/print")
public String print(){
System.out.println("sout打印日志");
log.info("logger 打印日志");
log.trace("logger trace...");
log.debug("logger debug...");
log.info("logger info...");
log.warn("logger warn...");
log.error("logger error...");
return "打印日志";
}
}

Lombok 会在编译时自动生成private static final Logger log = LoggerFactory.getLogger(LogController.class);,与手动编写效果一致,且更简洁
注意 : 如果 Lombok 冲突使用如下 pom.xml
html
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.boop</groupId>
<artifactId>Book</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Book</name>
<description>Book</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version> <!-- 可在 properties 中定义版本,或直接写具体版本号 -->
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
六、总结
- 日志是 Spring Boot 开发和线上运维的核心工具,除了排查问题,还承担系统监控、数据采集、日志审计等重要角色,是企业级项目的标配
- Spring Boot 内置SLF4J(日志门面)+ Logback(日志实现),开箱即用,门面模式实现了代码与具体日志框架的解耦,便于框架切换
- 日志级别从高到低为
FATAL>ERROR>WARN>INFO>DEBUG>TRACE,默认输出 INFO 级别,可通过配置调整,级别越高输出日志越少- 核心配置包括:日志级别(
logging.level)、持久化(logging.file.name/path)、文件分割(logback.rollingpolicy)、日志格式(logging.pattern)- 使用 Lombok 的
@Slf4j注解可替代手动获取日志对象,简化代码,提升开发效率





