这段内容是 Spring Boot 官方文档中关于日志(Logging)的完整说明,非常详尽。我们来逐层拆解、通俗易懂地解释每一部分的核心含义和实际用途,帮助你真正理解:
“Spring Boot 是怎么处理日志的?我该怎么配置?有哪些技巧?”
一、总体概览:Spring Boot 日志机制
✅ Spring Boot 使用什么日志?
- 内部使用 Commons Logging(一个抽象层)
- 但底层可以是多种实现:
- Logback(默认,推荐)
- Log4j2
- Java Util Logging(JUL)
你可以把 Commons Logging 看作“接口”,Logback/Log4j2 是“实现类”。
默认行为
- 如果你用了 Spring Boot 的 starter(如 spring-boot-starter-web),默认会用 Logback。
- 所有依赖库的日志(比如 Hibernate、Tomcat)都会被自动路由到 Logback,统一输出。
好处:不用操心不同库用不同日志框架的问题,全部归一。
5.4.1 日志格式(Log Format)
默认输出长这样:
2019-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
各字段含义:
| 部分 | 说明 |
|---|---|
2019-03-05 10:57:51.112 | 时间戳(精确到毫秒) |
INFO | 日志级别:ERROR、WARN、INFO、DEBUG、TRACE |
45469 | 当前进程 ID(PID) |
--- | 分隔符,表示后面是真正的日志消息 |
[ main ] | 线程名(main 线程) |
org.apache.catalina... | Logger 名称(通常是类名缩写) |
: Starting Servlet... | 实际日志内容 |
⚠️ 注意:Logback 没有
FATAL级别,它会被映射为ERROR。
️ 5.4.2 控制台输出(Console Output)
默认行为
- 只输出 ERROR、WARN、INFO 级别的日志。
- DEBUG 和 TRACE 不显示。
如何开启更多日志?
方法 1:启动时加 --debug
java -jar myapp.jar --debug
或在 application.properties 中写:
debug=true
✅ 效果:
- 核心组件(如嵌入式 Tomcat、Hibernate、Spring Boot 自身)会输出 DEBUG 级别日志
- ❌ 不代表所有日志都变成 DEBUG!
方法 2:启用 trace 模式
java -jar myapp.jar --trace
或:
trace=true
✅ 效果更强:
- Spring 全家桶、Hibernate Schema 生成等都会输出 TRACE 级别日志
彩色输出(Color-coded Output)
如果终端支持 ANSI(大多数现代终端都支持),日志会自动上色:
| 日志级别 | 颜色 |
|---|---|
| FATAL / ERROR | 红色 |
| WARN | 黄色 |
| INFO / DEBUG / TRACE | 绿色 |
自定义颜色格式
使用 %clr() 转换词:
%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){blue} %clr(%logger{36}){cyan} - %msg%n
支持的颜色:blue, cyan, faint, green, magenta, red, yellow
提示:可通过
spring.output.ansi.enabled=ALWAYS强制开启 ANSI。
5.4.3 文件输出(File Output)
默认行为
- 只输出到控制台,不写文件!
如何写日志到文件?
设置以下 任一属性:
| 配置项 | 作用 |
|---|---|
logging.file.name=my.log | 写入指定文件(可带路径) |
logging.file.path=/var/log | 写入该目录下的 spring.log |
示例:
logging.file.name=app.log # 当前目录下 app.log
logging.file.path=/var/log/myapp # /var/log/myapp/spring.log
日志滚动(自动归档)
- 单个日志文件超过 10MB 会自动滚动(重命名并压缩)
- 默认保留最近 7 天的日志
可配置项:
| 属性 | 说明 |
|---|---|
logging.file.max-size=10MB | 单个文件最大大小 |
logging.file.max-history=14 | 保留天数(默认 7) |
logging.file.total-size-cap=1GB | 所有归档日志总大小上限 |
logging.file.clean-history-on-start=true | 启动时清理旧日志 |
这些只对 Logback 默认配置有效。
5.4.4 日志级别控制(Log Levels)
设置方式:在 application.properties 中
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.com.mycompany=TRACE
logging.level.org.hibernate=ERROR
支持的级别:
TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
⚠️
OFF表示关闭该 logger 的所有日志
设置根日志器:
logging.level.root=INFO
用环境变量设置(适合 Docker/K8s):
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG
⚠️ 注意:环境变量只能设置包级别日志,不能设置某个具体类(因为会被转成小写)
5.4.5 日志分组(Log Groups)
问题:想一起调整多个相关 logger 的级别,太麻烦?
解决方案:定义日志组!
示例:定义一个 tomcat 组
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
然后一键设置整个组的级别:
logging.level.tomcat=TRACE
内置预定义组:
| 组名 | 包含的 logger |
|---|---|
web | Spring Web 相关(HTTP、Codec、Actuator Web) |
sql | JDBC、Hibernate SQL、jOOQ |
你可以直接使用:
logging.level.web=DEBUG
logging.level.sql=TRACE
5.4.6 使用关闭钩子释放资源(Shutdown Hook)
问题:JVM 关闭时,日志系统可能没来得及清理资源(如文件句柄)
解决方案:注册一个 JVM 关闭钩子
在 application.properties 中启用:
logging.register-shutdown-hook=true
✅ 效果:
- JVM 退出时,自动调用日志系统的
stop()方法 - 释放文件锁、关闭输出流等
适用于简单的单 Jar 应用,复杂部署(如 WAR 包)需手动管理。
⚙️ 5.4.7 自定义日志配置(Custom Log Configuration)
Spring Boot 支持哪些日志框架的配置文件?
| 日志系统 | 配置文件名(优先级从高到低) |
|---|---|
| Logback | logback-spring.xml > logback.xml |
| Log4j2 | logback2-spring.xml > logback2.xml |
| Java Util Logging | logging.properties |
✅ 强烈建议使用
-spring后缀(如logback-spring.xml),否则 Spring 无法完全控制初始化过程。
如何强制使用某个日志系统?
通过 JVM 参数:
-Dorg.springframework.boot.logging.LoggingSystem=org.springframework.boot.logging.logback.LogbackLoggingSystem
或禁用日志自动配置:
-Dlogging.system=none
⚠️ 日志在
ApplicationContext创建前就初始化了,所以不能用@PropertySource控制日志。
Spring Environment → System Properties 映射
Spring Boot 会把一些配置自动转成 System 属性,供日志框架使用:
| Spring 配置 | 转为 System Property | 用途 |
|---|---|---|
logging.file.name | LOG_FILE | 文件名 |
logging.pattern.console | CONSOLE_LOG_PATTERN | 控制台格式 |
logging.pattern.file | FILE_LOG_PATTERN | 文件输出格式 |
logging.pattern.level | LOG_LEVEL_PATTERN | 日志级别显示格式 |
示例:在 logback-spring.xml 中使用:
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){green} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%logger{36}){cyan} %clr(:){faint} %m%n"/>
高级技巧:在日志中加入 MDC 内容
MDC = Mapped Diagnostic Context(映射诊断上下文),可用于记录用户、请求 ID 等。
示例:在日志中显示当前用户
logging.pattern.level=user:%X{user} %5p
输出:
2019-08-30 12:30:04.031 user:someone INFO 22174 --- [nio-8080-exec-0] demo.Controller : Handling authenticated request
%X{user}是 MDC 中的 key,你可以在代码中设置:
MDC.put("user", "someone");
️ 5.4.8 Logback 扩展功能(Logback Extensions)
这些功能只能在 logback-spring.xml 中使用,不能在 logback.xml 中使用(因为加载太早)。
1️⃣ <springProfile>:根据 Spring Profile 动态切换配置
<springProfile name="dev">
<logger name="com.mycompany" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<logger name="com.mycompany" level="WARN"/>
</springProfile>
<springProfile name="dev | staging">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<springProfile name="!production">
<!-- 非生产环境才启用 -->
</springProfile>
支持表达式:dev & (eu-central|eu-west)
2️⃣ <springProperty>:从 application.properties 读取值
<springProperty scope="context" name="fluentHost"
source="myapp.fluentd.host"
defaultValue="localhost"/>
然后在 appender 中使用:
<remoteHost>${fluentHost}</remoteHost>
⚠️
source必须用 kebab-case(如myapp.fluentd.host),即使你在 Java 中写的是myapp.fluentdHost
总结:一张表帮你掌握核心要点
| 功能 | 配置方式 | 说明 |
|---|---|---|
| 默认日志框架 | starter 自动引入 Logback | 推荐使用 |
| 控制台输出 | 默认输出 INFO+ | 加 --debug 可看更多 |
| 彩色日志 | 终端支持 ANSI | 可通过 %clr() 自定义 |
| 写入文件 | logging.file.name 或 path | 自动滚动,10MB 切割 |
| 日志级别 | logging.level.xxx=DEBUG | 支持包、组、root |
| 日志分组 | logging.group.xxx=包名 | 一键控制多个 logger |
| 关闭钩子 | logging.register-shutdown-hook=true | 安全释放资源 |
| 自定义配置 | logback-spring.xml | 推荐使用 -spring 后缀 |
| Profile 切换 | <springProfile> | 按环境动态配置 |
| 读取配置值 | <springProperty> | 从 application.properties 取值 |
| MDC 输出 | logging.pattern.level=%X{key} %5p | 记录请求上下文 |
✅ 最佳实践建议
- 使用
logback-spring.xml而不是logback.xml - 用
logging.group管理常用模块日志 - 开发时用
--debug快速排查问题 - 生产环境关闭 DEBUG 日志,避免性能损耗
- 用 MDC 记录 traceId、userId 等上下文信息
- 启用
clean-history-on-start防止磁盘爆满 - 避免使用 Java Util Logging(有 classloading 问题)
如果你正在配置日志系统,可以根据你的需求选择:
- 想快速上手?→ 什么都不做,Spring Boot 默认就够用
- 想写文件?→ 加
logging.file.name=app.log - 想按环境不同输出?→ 用
logback-spring.xml + <springProfile> - 想记录用户?→ 用 MDC +
logging.pattern.level
需要我帮你写一个完整的 logback-spring.xml 示例吗?欢迎继续提问!
浙公网安备 33010602011771号