这段内容是 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
webSpring Web 相关(HTTP、Codec、Actuator Web)
sqlJDBC、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 支持哪些日志框架的配置文件?

日志系统配置文件名(优先级从高到低)
Logbacklogback-spring.xml > logback.xml
Log4j2logback2-spring.xml > logback2.xml
Java Util Logginglogging.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.nameLOG_FILE文件名
logging.pattern.consoleCONSOLE_LOG_PATTERN控制台格式
logging.pattern.fileFILE_LOG_PATTERN文件输出格式
logging.pattern.levelLOG_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.namepath自动滚动,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记录请求上下文

✅ 最佳实践建议

  1. 使用 logback-spring.xml 而不是 logback.xml
  2. logging.group 管理常用模块日志
  3. 开发时用 --debug 快速排查问题
  4. 生产环境关闭 DEBUG 日志,避免性能损耗
  5. 用 MDC 记录 traceId、userId 等上下文信息
  6. 启用 clean-history-on-start 防止磁盘爆满
  7. 避免使用 Java Util Logging(有 classloading 问题)

如果你正在配置日志系统,可以根据你的需求选择:

  • 想快速上手?→ 什么都不做,Spring Boot 默认就够用
  • 想写文件?→ 加 logging.file.name=app.log
  • 想按环境不同输出?→ 用 logback-spring.xml + <springProfile>
  • 想记录用户?→ 用 MDC + logging.pattern.level

需要我帮你写一个完整的 logback-spring.xml 示例吗?欢迎继续提问!