🌟 总体理解
Spring Boot 不强制使用任何日志框架,但它通过自动配置,推荐并简化了日志系统的使用。
- 默认使用 Logback (基于
spring-boot-starter-logging) - 支持替换为 Log4j2
- 你可以通过配置文件(如
logback.xml)或application.properties来控制日志行为 - 日志系统是自动配置的,基于 classpath 上存在的日志库
🔹 1. Spring Boot 日志基础机制
✅ 无强制依赖,但有默认选择
- Spring Boot 没有强制日志依赖 ,但依赖了
Commons Logging API(由 Spring 的spring-jcl模块提供) - 如果你用了
spring-boot-starter-web,它会间接引入spring-boot-starter-logging,从而默认使用 Logback - 所以:只要引入
spring-boot-starter-web,你就有了日志功能 ✅
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这个依赖会自动包含 Logback 和
spring-jcl,开箱即用。
✅ 日志系统抽象:LoggingSystem
Spring Boot 提供了一个抽象层 LoggingSystem,它会根据 classpath 上的日志库自动选择配置方式:
| classpath 上有 | 使用的 LoggingSystem |
|---|---|
| Logback | LogbackLoggingSystem |
| Log4j2 | Log4J2LoggingSystem |
| JDK logging | JdkLoggingSystem |
👉 优先级:Logback > Log4j2 > JDK logging
🔹 2. 简单配置:通过 application.properties
如果你只是想:
- 设置日志级别
- 指定日志输出文件
可以直接在 application.yml 或 application.properties 中配置:
✅ 设置日志级别
properties
logging.level.org.springframework.web=DEBUG
logging.level.com.example=INFO
logging.level.root=WARN
等价于 YAML:
yaml
logging:
level:
org.springframework.web: DEBUG
com.example: INFO
root: WARN
📌 支持包名前缀匹配,root 是根日志器。
✅ 输出日志到文件
properties
logging.file.name=myapp.log
# 或者指定目录
logging.file.path=/var/logs
会同时输出到 控制台 和 文件。
🔹 3. 高级配置:使用原生日志配置文件
如果你想做更精细的控制(如滚动策略、格式、异步日志等),就必须使用日志框架的原生配置文件。
Spring Boot 会自动加载这些文件:
| 日志框架 | 默认配置文件 |
|---|---|
| Logback | classpath:logback-spring.xml 或 logback.xml |
| Log4j2 | classpath:log4j2-spring.xml 或 log4j2.xml |
推荐使用
-spring后缀(如logback-spring.xml),因为它支持 Spring 特有的扩展功能(如 Profile 条件)。
🔹 4. 重点详解:Logback 配置(10.8.1)
Logback 是 Spring Boot 的默认日志框架。
✅ 如何自定义 Logback?
只需在 src/main/resources 下添加:
xml
logback-spring.xml
✅ Spring Boot 提供的 Logback 公共配置片段
Spring Boot 提供了一些可复用的 XML 片段,你可以 include 进来:
| 文件 | 作用 |
|---|---|
defaults.xml |
定义了默认的格式、转换规则、异常输出等 |
console-appender.xml |
控制台输出,带彩色 ANSI |
file-appender.xml |
文件输出,带滚动策略(按大小/时间) |
base.xml |
老版本兼容(不推荐) |
✅ 示例:自定义 logback-spring.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引入 Spring Boot 提供的默认配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 添加控制台输出 -->
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!-- 根日志器:输出到控制台 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
<!-- 单独设置某个包的日志级别 -->
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
📌 这样做可以复用 Spring Boot 的最佳实践,避免重复造轮子。
✅ 支持的系统变量(可在 XML 中使用)
| 变量 | 说明 |
|---|---|
${PID} |
当前进程 ID |
${LOG_FILE} |
logging.file.name 的值 |
${LOG_PATH} |
logging.file.path 的值 |
${LOG_EXCEPTION_CONVERSION_WORD} |
异常输出格式(如 %wEx) |
${ROLLING_FILE_NAME_PATTERN} |
滚动文件名模式 |
例如:
xml
<property name="LOG_FILE" value="${LOG_FILE:-${java.io.tmpdir}/spring.log}"/>
✅ 彩色控制台输出(仅控制台)
Spring Boot 使用 ANSI 颜色让日志在终端中更易读:
xml
<!-- 在 defaults.xml 中定义 -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
👉 在终端中看到彩色日志,在日志文件中是纯文本(颜色自动去掉)。
✅ 只输出到文件(不输出到控制台)
如果你只想写入文件,不想打印到控制台,可以这样配置:
xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-/tmp}/spring.log}"/>
<!-- 只引入 file-appender,不引入 console-appender -->
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
同时在 application.properties 中设置:
properties
logging.file.name=myapplication.log
✅ Groovy 配置(不推荐)
如果 classpath 有 Groovy,可以使用 logback.groovy,但:
- 不支持
logback-spring.groovy - 不支持 Spring 扩展功能
👉 所以建议还是用 XML。
🔹 5. 使用 Log4j2 替代 Logback(10.8.2)
虽然默认是 Logback,但你可以换成 Log4j2(性能更好,功能更强)。
✅ Maven 配置方式
需要:
- 排除默认的
spring-boot-starter-logging(Logback) - 引入
spring-boot-starter-log4j2
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 排除 Logback -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
✅ Gradle 配置方式
groovy
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
modules {
module('org.springframework.boot:spring-boot-starter-logging') {
replacedBy('org.springframework.boot:spring-boot-starter-log4j2', 'Use Log4j2 instead')
}
}
}
✅ 启用 Log4j2 的 JUL 适配器(重要!)
Tomcat 内部使用 java.util.logging(JUL),为了让这些日志也走 Log4j2,需要设置系统属性:
bash
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
可以加在启动脚本中,或 application.properties 中:
properties
# 不生效!必须在 JVM 启动时设置
# java.util.logging.manager=org.apache.logging.log4j.jul.LogManager ❌
✅ 正确做法:在 main 方法前设置,或启动命令加 -D。
✅ 使用 YAML 或 JSON 配置 Log4j2
Log4j2 支持多种配置格式:
| 格式 | 依赖 | 配置文件名 |
|---|---|---|
| YAML | jackson-databind + jackson-dataformat-yaml |
log4j2.yaml 或 log4j2.yml |
| JSON | jackson-databind |
log4j2.json 或 log4j2.jsn |
| XML | 无 | log4j2.xml |
只要文件名和依赖匹配,Spring Boot 会自动加载。
✅ 总结:Spring Boot 日志核心要点
| 问题 | 解决方案 |
|---|---|
| 默认用什么日志? | Logback (通过 spring-boot-starter-logging) |
| 如何快速设置日志级别? | logging.level.xxx=DEBUG in application.yml |
| 如何输出到文件? | logging.file.name=app.log |
| 如何自定义日志格式? | 使用 logback-spring.xml 或 log4j2-spring.xml |
| 如何只输出到文件? | 配置 file-appender.xml,不引入 console-appender.xml |
| 如何换为 Log4j2? | 排除 Logback,引入 spring-boot-starter-log4j2 |
| 如何让 Tomcat 日志也走 Log4j2? | -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager |
| 如何用 YAML 配置 Log4j2? | 加 jackson-dataformat-yaml,命名 log4j2.yaml |
📌 最佳实践建议
- 开发环境 :用
logback-spring.xml+ 彩色控制台,方便调试。 - 生产环境:输出到文件,启用滚动策略(按天或按大小)。
- 避免
@EnableWebMvc+ 自定义日志:不要轻易关闭自动配置。 - 使用
-spring.xml文件 :支持<springProfile>条件配置:
xml
<springProfile name="dev">
<root level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<root level="WARN"/>
</springProfile>
如果你有具体需求,比如:
- "我想让日志按天滚动"
- "如何让日志输出到 ELK"
- "怎么在日志中加入 traceId?"
欢迎继续提问,我可以给出具体代码示例。