文章目录
- 一、日志的作用
- 二、SpringBoot日志底层架构
- 三、两种打印日志方式
- 3.1 原生SLF4J
- 3.2 Lombok @Slf4j
- 四、日志级别
- 五、application全局配置
- 5.1 配置日志级别
- yml配置
- properties配置
- 5.2 日志持久化
- 5.3 日志自动分割
- 5.4 自定义日志输出格式
- 六、完整yml配置
一、日志的作用
- 线上问题定位排查:程序崩溃、接口报错、请求超时,需要依靠日志复现定位,是开发排障第一工具。
- 系统运行监控:记录接口响应耗时、调用频次、异常数量,对接监控平台设置阈值告警。
- 业务数据采集分析:日志记录用户浏览、点击、停留行为,统计PV/UV,给推荐算法提供原始数据,支撑运营策略优化。
- 安全操作审计:记录用户/管理员增删改查操作、敏感信息查询记录。出现数据泄露、恶意删改时,可通过日志追溯操作人、操作时间,满足等保、行业监管规范。
二、SpringBoot日志底层架构
门面模式:是一种设计模式,也称为外观模式,提供了一个统一的接口,用来访问子系统的一群接口
门面模式主要包含两种角色:
- 外观角色(Facade):也称为门面角色,是系统对外的统一接口
- 子系统角色(SubSystem):可以同时有一个或多个SubSystem,对于子系统来说Facade只是一个客户端,即Facade对SubSystem透明
日志框架:
这种日志框架就是门面模式的典型体现,SLF4J不是真正的日志实现,而是一个抽象层,对日志框架制定的一种标准,这样业务代码不用对接底层日志实现,只对接SLF4J门面。
- 业务代码只依赖SLF4J统一API;
- 底层可自由切换Logback/Log4j2,无需改动业务代码;
- 项目所有第三方组件统一使用一套日志配置。
三、两种打印日志方式
3.1 原生SLF4J
importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassLoggerController{// 绑定当前类,日志输出会携带类名,方便定位privatestaticfinalLoggerlogger=LoggerFactory.getLogger(LoggerController.class);@GetMapping("/print")publicStringprintLog(){// 不同级别日志输出logger.trace("追踪日志");logger.debug("调试日志");logger.info("正常业务日志");logger.warn("警告日志");logger.error("错误日志");return"日志打印完成";}}3.2 Lombok @Slf4j
每次手动创建Logger对象重复繁琐,Lombok一键生成日志对象log。
importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@Slf4j// 自动生成 Logger log 对象@RestControllerpublicclassLogController{@GetMapping("/log")publicStringtestLog(){log.info("用户访问日志接口");log.error("模拟异常报错");return"lombok日志输出";}}注解封装了创建log的过程
四、日志级别
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
- 级别越高,输出日志越少;配置基础级别后,只会打印当前级别及更高优先级日志。
- Logback无FATAL,自动映射为ERROR。
| 级别 | 使用场景 |
|---|---|
| FATAL | 系统致命故障,服务不可用,需管理员紧急处理 |
| ERROR | 程序报错、异常,不阻断整体服务运行 |
| WARN | 潜在风险,不影响业务,但需要关注 |
| INFO | 正常业务流程、启动、请求记录(SpringBoot默认级别) |
| DEBUG | 开发调试细节,生产环境关闭 |
| TRACE | 超细粒度追踪,极少使用(除非特殊用意,一般使用DEBUG代替) |
SpringBoot默认日志级别INFO,访问接口只会打印INFO/WARN/ERROR,DEBUG、TRACE不会输出。
五、application全局配置
5.1 配置日志级别
yml配置
- 在
logging.level.root中可以设置全局的日志级别,表示在显示这个级别及以上的日志信息; - 与root同级别可以指定某个目录日志级别
logging:level:root:debug# 全局根级别,所有包生效com.example.demo:trace# 指定业务包打印TRACE日志properties配置
logging.level.root=debug logging.level.com.example.demo=trace5.2 日志持久化
控制台中的日志重启就会丢失,要想持久化的保存日志有两种配置方式:
- 指定完整文件名(优先级更高)
logging:file:name:logs/demo.log# 相对路径,项目根目录logs文件夹- 指定存储目录
logging:file:path:D:/server/logs# 绝对路径内容都会被识别为路径,文件名为spring.log
注意:
- 即使服务器重启,这个文件也不会丢失,新日志会追加在之前的日志后面
name和path同时配置,仅name生效。
5.3 日志自动分割
日志文件持续写入会膨胀,为了防止防止单文件超大,SpringBoot默认10MB自动分割。
可自定义阈值、归档格式:
logging:logback:rollingpolicy:max-file-size:200MB# 单文件最大容量,企业常用200~500Mfile-name-pattern:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz# 分割后文件名:demo.log.2026-07-21.0.gz%d{yyyy-MM-dd}:按日期归档%i:同一天多文件自增索引.gz:自动压缩历史日志,节省磁盘
5.4 自定义日志输出格式
日志内置字段:
%d{yyyy-MM-dd HH:mm:ss.SSS}:精确毫秒时间%5p:日志级别%t:线程名%logger{39}:打印类名%m:日志内容%n:换行
自定义控制台和文件:
logging:pattern:# 控制台彩色日志console:'%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr([%t]){cyan} %-40logger : %m%n'# 文件无彩色格式file:'%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40logger : %m%n'Spring启动时有默认的日志输出:
六、完整yml配置
logging:# 日志文件存储file:name:logs/demo-service.log# 日志级别控制level:root:infocom.example.demo:debugorg.springframework:warnorg.mybatis:warn# 日志滚动分割策略logback:rollingpolicy:max-file-size:200MBfile-name-pattern:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzmax-history:30# 保留30天历史日志# 自定义日志格式pattern:console:'%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr([%15.15t]){cyan} %-40.40logger{39} : %m%n%wEx'file:'%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%t] %-40.40logger{39} : %m%n%wEx'