SpringBoot日志框架全解析

一、日志的学习必要性

  • 基础场景:从 JavaSE 阶段的System.out.print到 Spring 开发,日志常用于定位程序问题、分析运行过程
  • 进阶需求:随着项目复杂度提升,日志需满足审计记录、用户行为分析、数据持久化 等场景,而原生打印方式无法满足,因此需要专业日志框架

二、日志的核心用途

  1. 系统监控

    • 记录系统运行状态(如方法响应时间、状态),通过数据分析设置阈值告警(如关键字数量触发预警),是成熟系统的标配功能。
  2. 数据采集

    • 数据统计:收集页面 PV/UV、点击量等数据,用于优化运营策略。
    • 推荐排序:记录用户浏览、停留时长等行为,作为算法模型的训练数据,支撑购物、广告等领域的推荐功能。

3.日志审计

  • 满足政策 / 行业规范要求,用于追踪操作行为(如数据删除 / 修改的责任人)、识别非法攻击 / 调用、防范内部违规与信息泄露(如客户信息查询的记录与预警)。

三、⽇志使⽤

SpringBoot项⽬在启动的时候默认就有⽇志输出,如下图所⽰:

它打印的⽇志和 System.out.print 有什么不同呢

Spring Boot 默认日志与System.out.print的差异
对比项 Spring Boot 默认日志 System.out.print
信息维度 包含时间、日志级别、线程、类路径等 仅输出自定义文本,无额外上下文信息
场景适配性 适配框架运行状态(如启动流程) 仅用于简单文本打印
Spring Boot 的日志框架

Spring Boot 内置了SLF4J日志框架,支持直接在程序中调用该框架输出日志,其优势包括:

  1. 标准化日志接口,可适配不同日志实现(如 Logback、Log4j2);
  2. 支持日志级别控制、多环境配置等进阶功能。

3.1打印⽇志

打印⽇志的步骤:

  • 在程序中得到⽇志对象.
  • 使⽤⽇志对象输出要打印的内容.
1. 日志对象的获取
  • 方式 :通过LoggerFactory.getLogger(当前类.class)获取Logger对象,参数需传入当前类的 Class 对象(用于标识日志所属类,便于定位问题)。
  • 注意事项Logger类需导入**org.slf4j**包,避免导入其他包的同名类(如java.util.logging.Logger)。
2. 日志的打印
  • 方法 :使用Logger对象的info()等方法输出日志内容(SLF4J 还支持debug()warn()error()等不同级别方法)。
  • 效果:日志会包含时间、线程、日志级别、类名等信息,便于调试和排查问题(示例中输出了自定义的日志内容)。

3.2⽇志框架介绍

1. 日志框架的分层
  • 日志门面 :是日志系统的抽象层(规范 / 接口),不能独立使用,需配合具体实现。包含:
    • commons-logging
    • SLF4J(典型的门面模式应用)
  • 日志实现 :具体的日志功能实现框架,包含:
    • log4j 1/2
    • JUL(Java Util Logging)
    • logback
2. 门面模式(外观模式)的解读
  • 定义:为子系统提供统一的高层接口,简化外部与子系统的交互。
  • 核心角色
    • 外观角色(Facade):系统对外的统一接口。
    • 子系统角色(SubSystem):是类的集合,自身不感知 Facade 的存在。
3.门面模式的代码实现示例与优点说明
1.子系统角色
  • 定义Light接口(规范灯的on()/off()行为);
  • 实现LivingRoomLight(客厅灯)、HallLight(走廊灯)、DiningLight(餐厅灯)等具体灯类,各自实现开关逻辑。
2.外观角色
  • LightFacade类封装所有子系统(各盏灯),提供lightOn()/lightOff()方法,统一控制所有灯的开关。
3.客户端调用
  • 通过LightFacade的单一接口,无需直接操作每盏灯,仅调用lightOn()即可打开所有灯。
门面模式的优点
  1. 降低耦合:客户端与子系统解耦,子系统的修改不会影响客户端;
  2. 简化使用:客户端无需了解子系统细节,仅通过门面接口即可完成操作;
  3. 增强安全:可通过门面控制子系统的访问权限(未在门面暴露的方法,客户端无法调用)。
3.3SLF4J框架介绍
1.SLF4J 的定位

SLF4J 是日志门面框架,仅提供统一的日志 API 接口,不包含具体的日志逻辑实现,相当于各类日志框架(如 log4j、logback)的 "统一入口"。

2.不引入日志门面的问题

当项目中同时依赖多个日志框架(如项目用 log4j,第三方依赖用 logback),会出现以下问题:

  1. 多套配置维护:不同日志框架的 API 和配置文件不同,需维护多套配置;
  2. 代码耦合高:更换日志框架时需修改代码,易引发冲突;
  3. 第三方依赖混乱:多套第三方框架依赖不同日志,需维护多套配置。
3.引入 SLF4J 日志门面的优势

通过 SLF4J 作为统一接口,项目与日志实现框架之间的关系会优化:

  1. 统一配置:仅需维护一套日志配置文件;
  2. 解耦代码:更换底层日志框架(如从 log4j 换为 logback)时,无需修改业务代码;
  3. 兼容多框架:项目和第三方依赖可通过 SLF4J 对接同一套日志实现,避免多框架共存的混乱。

简言之,SLF4J 的核心价值是让代码与具体日志框架解耦,简化日志系统的维护与切换。

3.4⽇志格式的说明

复制代码
2026-01-1 15:43:07.385  INFO 21404 --- [main] com.example.demo.SpringLogApplication : Started SpringLogApplication in 2.779 seconds
  1. 时间日期 :精确到毫秒(如2026-01-1 15:43:07.385),用于定位日志产生的时间;
  2. 日志级别 :标识日志的严重程度(如INFO);
  3. 进程 ID :当前应用进程的 ID(如21404),多实例部署时用于区分不同进程;
  4. 线程名 :日志产生时对应的线程(如main),用于排查多线程问题;
  5. Logger 名 :通常是产生日志的类全限定名(如com.example.demo.SpringLogApplication),用于定位日志来源;
  6. 日志内容 :具体的日志信息(如Started SpringLogApplication...)。
2.日志级别的核心逻辑

日志级别是按 "信息重要性 / 严重程度" 划分的分级机制,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如只关注error级别的,就可以根据级别过滤出来error级别的⽇志信息,节约开发者的信息筛选时间

3.日志级别的分类(从高到低)

级别越高,代表信息越严重,默认输出的日志越少:

级别 含义说明
FATAL 致命错误:系统级故障,必须立即处理(如服务崩溃),通常进程会终止。
ERROR 错误信息:功能异常,但系统仍可运行(如接口调用失败)。
WARN 警告信息:存在潜在风险,但不影响当前功能(如参数格式不规范)。
INFO 普通信息:记录系统正常运行的关键节点(如服务启动完成、请求处理结束)。
DEBUG 调试信息:开发阶段用于排查问题的细节(如变量值、方法执行流程)。
TRACE 追踪信息:比 DEBUG 更细粒度的信息(一般开发中用 DEBUG 替代,避免日志冗余)。
4.日志级别的使用规则
  1. 级别过滤逻辑 :日志框架会设置 "输出级别阈值",仅输出大于等于该级别的日志。例如:

    • 若阈值为INFO,则输出INFO、WARN、ERROR、FATAL
    • 若阈值为DEBUG,则输出DEBUG、INFO、WARN、ERROR、FATAL
  2. SpringBoot 默认行为 :SpringBoot 默认日志框架Logback ,默认输出级别 为**INFO** ,因此示例中仅打印了INFO、WARN、ERROR级别的日志(DEBUG、TRACE被过滤)。

  3. 注意事项

    • 日志级别是开发人员根据信息重要性设置的,与测试的 Bug 级别无关;
    • Logback 中没有FATAL级别,会将其映射到ERROR级别;
    • FATAL级别的日志应极少出现(通常进程生命周期内仅 1 次),代表服务不可用。
5.日志级别的实际意义

通过级别划分,可实现:

  • 减少日志冗余 :生产环境用INFO级别,避免调试日志占用资源;
  • 快速定位问题 :故障时可调整级别为DEBUG,获取更多细节;
  • 分级关注重点 :运维优先关注ERROR/FATAL,开发调试关注DEBUG

简言之,日志格式是 "日志的标准化结构",日志级别是 "日志的优先级过滤机制",二者结合让日志既规范又高效。

3.5⽇志配置

1.配置日志级别

日志级别通过logging.level配置,用于设置全局 / 指定包的日志输出阈值,支持propertiesyml两种格式(二选一):

1. 1配置语法

Properties 格式

YML 格式

配置root=debug后,日志会输出DEBUG、INFO、WARN、ERROR级别内容(之前默认INFO仅输出后三者),实现更详细的调试日志。

2.日志持久化(日志保存到文件)

默认日志仅输出到控制台,线上环境需将日志保存到文件 (持久化),通过logging.file.namelogging.file.path配置:

1. 配置日志文件名(指定路径 + 文件名)

Properties 格式

YML 格式

效果:日志会写入指定路径的springboot.log文件中

2.配置日志存储目录(仅指定路径,文件名固定)

Properties 格式

YML 格式

  • 效果:日志会写入指定目录下的spring.log文件(文件名固定)。

这种⽅式只能设置⽇志的路径,⽂件名为固定的spring.log运⾏程序,该路径下多出⼀个⽇志⽂件:spring.log

注意事项
  • logging.file.namelogging.file.path同时配置时,name生效
  • 路径支持相对路径(基于项目根目录)或绝对路径(如D:/temp)。
3.日志文件分割(解决日志文件过大问题)

1. 若日志长期写入一个文件,会导致文件体积过大,需配置日志分割(自动拆分日志文件)。

SpringBoot 默认日志框架(Logback)的分割规则:

  • 大小分割 :默认单个日志文件达到10MB时,自动拆分新文件(文件名后缀加序号,如springboot.log.1);
  • 时间分割 :可通过自定义 Logback 配置文件(如logback-spring.xml)设置按天 / 小时分割(需手动配置,默认不开启)。
配置项 说明 默认值
logging.logback.rollingpolicy.file-name-pattern 分割后的日志文件名格式 ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size 触发分割的文件大小阈值 10MB

**2.**配置⽇志⽂件分割:

Properties 格式

yml 格式:

  1. 日期格式生效逻辑%d{yyyy-MM-dd} 是 Logback 的日期格式化规则,会自动替换为日志分割时的实际日期(比如 2026 年 1 月 1 日分割的文件,名称就是 springboot.log.2026-01-01.0);
  2. 序号 % i 的作用 :如果同一天内日志文件多次达到 max-file-size 阈值,序号会自增(如 2026-01-01.02026-01-01.12026-01-01.2),避免同天文件覆盖;
  3. 生产环境调整
    • max-file-size 建议改为 200MB500MB(1KB 仅用于测试分割效果);
    • max-history 建议保留 7~30 天(根据业务日志留存需求);
    • total-size-cap 限制日志总占用空间,防止磁盘被占满。
效果验证

配置后,当 springboot.log 文件大小超过 1KB 时,会自动生成:

  • 第一个分割文件:springboot.log.2026-01-01.0
  • 第二个分割文件:springboot.log.2026-01-01.1
  • 次日分割文件:springboot.log.2026-01-02.0(日期自动切换)

日志配置的作用是灵活控制日志的输出级别、存储位置、文件管理,让日志既满足调试需求,又适配线上环境的持久化、轻量化要求。

4.配置⽇志格式
1.日志格式的配置项

日志格式支持控制台文件分别配置,对应两个核心配置项:

配置项 说明 默认格式(示例)
logging.pattern.console 控制台日志格式 包含颜色、时间、级别、进程 ID 等信息
logging.pattern.file 日志文件格式 不含颜色,包含时间、级别、线程名等信息
2.格式占位符的核心含义

日志格式通过占位符定义内容,常用占位符及作用:

  1. 颜色控制
    • %clr(表达式){颜色}:为控制台日志设置颜色(支持 blue/cyan/green/red 等颜色),仅控制台生效。
  2. 时间与日期
    • %d{格式}:输出日期时间,默认格式为yyyy-MM-dd'T'HH:mm:ss.SSSXXX(精确到毫秒)。
  3. 日志核心信息
    • %p:输出日志级别(ERROR/WARN/INFO 等);
    • %t/%thread:输出线程名;
    • %c/%logger:输出日志所属类的全限定名;
    • %M:输出方法名;
    • %L:输出代码行号;
    • %m/%msg:输出日志内容;
    • %n:输出换行符。
  4. 格式对齐 / 截断
    • %5:字符长度不足 5 时,右侧补空格;
    • %-5:字符长度不足 5 时,左侧补空格;
    • %.15:字符长度超过 15 时,截断多余部分;
    • %15.15:字符长度不足 15 时右侧补空格,超过则截断。

Properties配置:

yml配置:

3.注意事项
  • 颜色不生效的解决:IDEA 中需配置 VM 选项,开启控制台颜色支持;
  • 格式的灵活性:可通过组合占位符,自定义日志的输出结构(如调整信息的显示顺序、长度);
  • 默认格式的适用性:默认格式已包含核心信息,通常无需额外配置,仅在特殊场景(如日志分析工具适配)下需要自定义。

这些规则让日志格式既能满足可读性需求,也能适配不同的展示 / 分析场景。

参考:https://logback.qos.ch/manual/layouts.html#conversionWord

需要配置,让idea⽀持控制台颜⾊显⽰

  1. 打开启动配置,添加VMoptions
  1. 添加VMoptions-Dspring.output.ansi.enabled=ALWAYS

3.重新启动程序,就发现控制台⽀持颜⾊了

四、通过 Lombok 简化 SpringBoot 日志输出

1.简化日志输出的背景

传统日志需手动通过LoggerFactory.getLogger(类名.class)创建Logger对象,每个类都要重复编写,流程繁琐。Lombok 的@Slf4j注解可自动生成日志对象,减少重复代码。

2.实现步骤
1. 添加 Lombok 依赖

在项目的pom.xml中引入 Lombok 框架:

2. 使用@Slf4j注解输出日志

在需要输出日志的类上添加@Slf4j注解,Lombok 会自动生成名为log的日志对象,直接使用即可:

3.原理说明

Lombok 在编译阶段,会自动为标注@Slf4j的类生成以下代码:

相当于替开发者完成了日志对象的创建,实现 "注解替代重复代码" 的效果。

4.核心总结

通过 Lombok 的@Slf4j注解,可快速在类中获取日志对象,避免手动创建Logger的繁琐操作,提升开发效率。结合日志的级别、格式等配置,能更高效地实现日志输出。

相关推荐
好奇龙猫2 小时前
【人工智能学习-AI-MIT公开课-10. 学习介绍、最近邻】
人工智能·学习
小毅&Nora2 小时前
【Java线程安全实战】② ConcurrentHashMap 源码深度拆解:如何做到高性能并发?
java·安全·多线程
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]open
linux·笔记·学习
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]nsfs
linux·笔记·学习
Knight_AL2 小时前
阿里《Java 开发手册》下的对象构建与赋值规范实践
java·开发语言
手揽回忆怎么睡2 小时前
Streamlit学习笔记2
笔记·学习
步步为营DotNet3 小时前
深入理解.NET 中的IHostedService:后台任务管理的基石
java·网络·.net
独自破碎E3 小时前
Leetcode862和至少为K的最短子数组
java·开发语言
To Be Clean Coder3 小时前
【Spring源码】getBean源码实战(二)
java·后端·spring