【Java EE】Spring 日志详解

📅 2026/7/23 1:03:27 👁️ 阅读次数 📝 编程学习
【Java EE】Spring 日志详解

文章目录

  • 一、日志的作用
  • 二、SpringBoot日志底层架构
  • 三、两种打印日志方式
    • 3.1 原生SLF4J
    • 3.2 Lombok @Slf4j
  • 四、日志级别
  • 五、application全局配置
    • 5.1 配置日志级别
      • yml配置
      • properties配置
    • 5.2 日志持久化
    • 5.3 日志自动分割
    • 5.4 自定义日志输出格式
  • 六、完整yml配置

一、日志的作用

  1. 线上问题定位排查:程序崩溃、接口报错、请求超时,需要依靠日志复现定位,是开发排障第一工具。
  2. 系统运行监控:记录接口响应耗时、调用频次、异常数量,对接监控平台设置阈值告警。
  3. 业务数据采集分析:日志记录用户浏览、点击、停留行为,统计PV/UV,给推荐算法提供原始数据,支撑运营策略优化。
  4. 安全操作审计:记录用户/管理员增删改查操作、敏感信息查询记录。出现数据泄露、恶意删改时,可通过日志追溯操作人、操作时间,满足等保、行业监管规范。

二、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=trace

5.2 日志持久化

控制台中的日志重启就会丢失,要想持久化的保存日志有两种配置方式:

  1. 指定完整文件名(优先级更高)
logging:file:name:logs/demo.log# 相对路径,项目根目录logs文件夹
  1. 指定存储目录
logging:file:path:D:/server/logs# 绝对路径

内容都会被识别为路径,文件名为spring.log

注意

  1. 即使服务器重启,这个文件也不会丢失,新日志会追加在之前的日志后面
  2. namepath同时配置,仅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'