一、日志的学习必要性
- 基础场景:从 JavaSE 阶段的
System.out.print到 Spring 开发,日志常用于定位程序问题、分析运行过程。 - 进阶需求:随着项目复杂度提升,日志需满足审计记录、用户行为分析、数据持久化 等场景,而原生打印方式无法满足,因此需要专业日志框架。
二、日志的核心用途
-
系统监控
- 记录系统运行状态(如方法响应时间、状态),通过数据分析设置阈值告警(如关键字数量触发预警),是成熟系统的标配功能。
-
数据采集
- 数据统计:收集页面 PV/UV、点击量等数据,用于优化运营策略。
- 推荐排序:记录用户浏览、停留时长等行为,作为算法模型的训练数据,支撑购物、广告等领域的推荐功能。

3.日志审计
- 满足政策 / 行业规范要求,用于追踪操作行为(如数据删除 / 修改的责任人)、识别非法攻击 / 调用、防范内部违规与信息泄露(如客户信息查询的记录与预警)。
三、⽇志使⽤
SpringBoot项⽬在启动的时候默认就有⽇志输出,如下图所⽰:

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

Spring Boot 默认日志与System.out.print的差异
| 对比项 | Spring Boot 默认日志 | System.out.print |
|---|---|---|
| 信息维度 | 包含时间、日志级别、线程、类路径等 | 仅输出自定义文本,无额外上下文信息 |
| 场景适配性 | 适配框架运行状态(如启动流程) | 仅用于简单文本打印 |
Spring Boot 的日志框架
Spring Boot 内置了SLF4J日志框架,支持直接在程序中调用该框架输出日志,其优势包括:
- 标准化日志接口,可适配不同日志实现(如 Logback、Log4j2);
- 支持日志级别控制、多环境配置等进阶功能。
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()即可打开所有灯。

门面模式的优点
- 降低耦合:客户端与子系统解耦,子系统的修改不会影响客户端;
- 简化使用:客户端无需了解子系统细节,仅通过门面接口即可完成操作;
- 增强安全:可通过门面控制子系统的访问权限(未在门面暴露的方法,客户端无法调用)。
3.3SLF4J框架介绍
1.SLF4J 的定位
SLF4J 是日志门面框架,仅提供统一的日志 API 接口,不包含具体的日志逻辑实现,相当于各类日志框架(如 log4j、logback)的 "统一入口"。
2.不引入日志门面的问题
当项目中同时依赖多个日志框架(如项目用 log4j,第三方依赖用 logback),会出现以下问题:
- 多套配置维护:不同日志框架的 API 和配置文件不同,需维护多套配置;
- 代码耦合高:更换日志框架时需修改代码,易引发冲突;
- 第三方依赖混乱:多套第三方框架依赖不同日志,需维护多套配置。

3.引入 SLF4J 日志门面的优势
通过 SLF4J 作为统一接口,项目与日志实现框架之间的关系会优化:
- 统一配置:仅需维护一套日志配置文件;
- 解耦代码:更换底层日志框架(如从 log4j 换为 logback)时,无需修改业务代码;
- 兼容多框架:项目和第三方依赖可通过 SLF4J 对接同一套日志实现,避免多框架共存的混乱。

简言之,SLF4J 的核心价值是让代码与具体日志框架解耦,简化日志系统的维护与切换。
3.4⽇志格式的说明
2026-01-1 15:43:07.385 INFO 21404 --- [main] com.example.demo.SpringLogApplication : Started SpringLogApplication in 2.779 seconds
- 时间日期 :精确到毫秒(如
2026-01-1 15:43:07.385),用于定位日志产生的时间; - 日志级别 :标识日志的严重程度(如
INFO); - 进程 ID :当前应用进程的 ID(如
21404),多实例部署时用于区分不同进程; - 线程名 :日志产生时对应的线程(如
main),用于排查多线程问题; - Logger 名 :通常是产生日志的类全限定名(如
com.example.demo.SpringLogApplication),用于定位日志来源; - 日志内容 :具体的日志信息(如
Started SpringLogApplication...)。
2.日志级别的核心逻辑
日志级别是按 "信息重要性 / 严重程度" 划分的分级机制,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如只关注error级别的,就可以根据级别过滤出来error级别的⽇志信息,节约开发者的信息筛选时间
3.日志级别的分类(从高到低)
级别越高,代表信息越严重,默认输出的日志越少:
| 级别 | 含义说明 |
|---|---|
| FATAL | 致命错误:系统级故障,必须立即处理(如服务崩溃),通常进程会终止。 |
| ERROR | 错误信息:功能异常,但系统仍可运行(如接口调用失败)。 |
| WARN | 警告信息:存在潜在风险,但不影响当前功能(如参数格式不规范)。 |
| INFO | 普通信息:记录系统正常运行的关键节点(如服务启动完成、请求处理结束)。 |
| DEBUG | 调试信息:开发阶段用于排查问题的细节(如变量值、方法执行流程)。 |
| TRACE | 追踪信息:比 DEBUG 更细粒度的信息(一般开发中用 DEBUG 替代,避免日志冗余)。 |

4.日志级别的使用规则
-
级别过滤逻辑 :日志框架会设置 "输出级别阈值",仅输出大于等于该级别的日志。例如:
- 若阈值为
INFO,则输出INFO、WARN、ERROR、FATAL; - 若阈值为
DEBUG,则输出DEBUG、INFO、WARN、ERROR、FATAL。
- 若阈值为
-
SpringBoot 默认行为 :SpringBoot 默认日志框架 是Logback ,默认输出级别 为**
INFO** ,因此示例中仅打印了INFO、WARN、ERROR级别的日志(DEBUG、TRACE被过滤)。 -
注意事项:
- 日志级别是开发人员根据信息重要性设置的,与测试的 Bug 级别无关;
- Logback 中没有
FATAL级别,会将其映射到ERROR级别; FATAL级别的日志应极少出现(通常进程生命周期内仅 1 次),代表服务不可用。
5.日志级别的实际意义
通过级别划分,可实现:
- 减少日志冗余 :生产环境用
INFO级别,避免调试日志占用资源; - 快速定位问题 :故障时可调整级别为
DEBUG,获取更多细节; - 分级关注重点 :运维优先关注
ERROR/FATAL,开发调试关注DEBUG。
简言之,日志格式是 "日志的标准化结构",日志级别是 "日志的优先级过滤机制",二者结合让日志既规范又高效。
3.5⽇志配置
1.配置日志级别
日志级别通过logging.level配置,用于设置全局 / 指定包的日志输出阈值,支持properties和yml两种格式(二选一):
1. 1配置语法
Properties 格式:

YML 格式:

配置root=debug后,日志会输出DEBUG、INFO、WARN、ERROR级别内容(之前默认INFO仅输出后三者),实现更详细的调试日志。
2.日志持久化(日志保存到文件)
默认日志仅输出到控制台,线上环境需将日志保存到文件 (持久化),通过logging.file.name或logging.file.path配置:
1. 配置日志文件名(指定路径 + 文件名)
Properties 格式:

YML 格式:

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

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

YML 格式:

- 效果:日志会写入指定目录下的
spring.log文件(文件名固定)。
这种⽅式只能设置⽇志的路径,⽂件名为固定的spring.log运⾏程序,该路径下多出⼀个⽇志⽂件:spring.log

注意事项
logging.file.name和logging.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 格式:

- 日期格式生效逻辑 :
%d{yyyy-MM-dd}是 Logback 的日期格式化规则,会自动替换为日志分割时的实际日期(比如 2026 年 1 月 1 日分割的文件,名称就是springboot.log.2026-01-01.0); - 序号 % i 的作用 :如果同一天内日志文件多次达到
max-file-size阈值,序号会自增(如2026-01-01.0→2026-01-01.1→2026-01-01.2),避免同天文件覆盖; - 生产环境调整 :
max-file-size建议改为200MB或500MB(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.格式占位符的核心含义
日志格式通过占位符定义内容,常用占位符及作用:
- 颜色控制 :
%clr(表达式){颜色}:为控制台日志设置颜色(支持 blue/cyan/green/red 等颜色),仅控制台生效。
- 时间与日期 :
%d{格式}:输出日期时间,默认格式为yyyy-MM-dd'T'HH:mm:ss.SSSXXX(精确到毫秒)。
- 日志核心信息 :
%p:输出日志级别(ERROR/WARN/INFO 等);%t/%thread:输出线程名;%c/%logger:输出日志所属类的全限定名;%M:输出方法名;%L:输出代码行号;%m/%msg:输出日志内容;%n:输出换行符。
- 格式对齐 / 截断 :
%5:字符长度不足 5 时,右侧补空格;%-5:字符长度不足 5 时,左侧补空格;%.15:字符长度超过 15 时,截断多余部分;%15.15:字符长度不足 15 时右侧补空格,超过则截断。
Properties配置:

yml配置:

3.注意事项
- 颜色不生效的解决:IDEA 中需配置 VM 选项,开启控制台颜色支持;
- 格式的灵活性:可通过组合占位符,自定义日志的输出结构(如调整信息的显示顺序、长度);
- 默认格式的适用性:默认格式已包含核心信息,通常无需额外配置,仅在特殊场景(如日志分析工具适配)下需要自定义。
这些规则让日志格式既能满足可读性需求,也能适配不同的展示 / 分析场景。
参考:https://logback.qos.ch/manual/layouts.html#conversionWord
需要配置,让idea⽀持控制台颜⾊显⽰
- 打开启动配置,添加VMoptions

- 添加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的繁琐操作,提升开发效率。结合日志的级别、格式等配置,能更高效地实现日志输出。