在 Java 开发中,我们常常看到初学者使用 System.out.println() 打印调试信息。虽然简单直接,但这种方式存在严重问题:
- ❌ 无法控制输出级别(如只看错误日志);
- ❌ 无法将日志写入文件;
- ❌ 性能差,大量输出会拖慢应用;
- ❌ 无法格式化、归档、轮转。
✅ 正确做法是:使用专业的日志框架。在 Spring Boot 项目中,SLF4J + Logback 是官方推荐、性能优异、功能强大的组合。
本节课将带你掌握:
- 什么是 SLF4J 及其优势;
- 如何在 Spring Boot 中配置日志;
- 编写
logback.xml实现日志分级、文件滚动、格式定制; - 在代码中正确使用
Logger打印日志。
1. 为什么选择 SLF4J?
1.1 SLF4J 是什么?
SLF4J(Simple Logging Facade for Java) 是一个日志门面(Facade),它不负责实际的日志输出,而是提供统一的 API 接口,背后可以对接 Logback、Log4j、java.util.logging 等具体实现。
就像 JDBC 是数据库访问的门面一样,SLF4J 是日志系统的“通用接口”。
1.2 核心优势
| 优势 | 说明 |
| ✅ 解耦日志实现 | 切换日志框架(如从 Log4j 换成 Logback)只需改依赖,无需修改代码 |
| ✅ 占位符支持 | logger.info("用户 {} 登录成功", username),避免字符串拼接开销 |
| ✅ 级别判断优化 | 自动判断日志级别是否启用,避免无谓的对象创建 |
| ✅ 阿里规约强制要求 | 《阿里巴巴 Java 开发手册》明确要求:禁止直接使用 Log4j/Logback API,必须通过 SLF4J |
📌 结论:SLF4J 是企业级项目的标准选择。
2. 在代码中使用 Logger
使用方式非常简单:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/test") public class TestController { // 1. 获取 Logger 实例(类名作为 logger 名) private static final Logger logger = LoggerFactory.getLogger(TestController.class); @GetMapping("/log") public String testLog() { // 2. 按不同级别打印日志 logger.debug("调试信息:用户正在访问 /log"); logger.info("普通信息:请求已接收"); logger.warn("警告信息:参数可能不完整"); logger.error("错误信息:数据库连接失败"); // 3. 使用占位符(推荐!避免字符串拼接) String blog1 = "blog.itcodai.com"; String blog2 = "blog.csdn.net/eson_15"; logger.info("倪升武的博客:{};CSDN:{}", blog1, blog2); return "success"; } }
💡 最佳实践:
- Logger 声明为
private static final;- 使用
{}占位符,不要用+拼接字符串;- 生产环境通常关闭
DEBUG日志,避免性能损耗。
3. Spring Boot 中的日志配置
Spring Boot 默认集成 SLF4J + Logback,无需额外引入依赖。
3.1 配置方式:application.yml
logging: # 指定自定义 logback 配置文件(可选) config: classpath:logback.xml # 设置特定包的日志级别(常用于开启 SQL 日志) level: com.itcodai.course03.dao: trace com.itcodai.course03.service: debug
🔍 说明:
logging.config:指向自定义的logback.xml;logging.level:可快速覆盖某些包的日志级别,优先级高于 logback.xml。
3.2 日志级别(从高到低)
| 级别 | 用途 |
ERROR |
系统错误、异常 |
WARN |
警告,不影响主流程 |
INFO |
重要业务日志(如启动完成、用户登录) |
DEBUG |
调试信息(开发阶段使用) |
TRACE |
更细粒度(如 MyBatis 的 SQL 日志) |
✅ 生产建议:全局设为
INFO,关键模块可临时调为DEBUG。
4. logback.xml 详解(核心配置文件)
当需要精细控制日志行为时,需编写 logback.xml(放在 src/main/resources 下)。
完整示例:logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 1. 定义日志格式和文件路径 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> <property name="LOG_PATH" value="D:/logs/course03"/> <!-- Windows 路径 --> <!-- Linux 示例:<property name="LOG_PATH" value="/var/logs/myapp"/> --> <!-- 2. 控制台输出 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 3. 文件输出(按天+大小滚动) --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日志文件命名规则 --> <fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 单个文件最大 100MB --> <maxFileSize>100MB</maxFileSize> <!-- 保留 30 天日志 --> <maxHistory>30</maxHistory> <!-- 总日志大小不超过 10GB --> <totalSizeCap>10GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 4. 日志级别与输出目标 --> <logger name="com.itcodai.course03" level="INFO" additivity="false"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </logger> <!-- 5. 根日志器(兜底) --> <root level="INFO"> <appender-ref ref="CONSOLE"/> </root> </configuration>
关键配置说明
| 配置项 | 作用 |
<property> |
定义可复用的变量(如格式、路径) |
<appender> |
定义日志输出目的地(控制台、文件等) |
RollingFileAppender |
支持日志滚动(按时间/大小切分) |
SizeAndTimeBasedRollingPolicy |
同时按天和文件大小滚动 |
<logger> |
为特定包设置独立日志级别和输出方式 |
additivity="false" |
禁止日志向上级(root)重复输出 |
⚠️ 注意:
- 路径必须是绝对路径(Windows 用
/或\\);%i是文件索引,当日志达到maxFileSize时自动生成app.2025-12-29.0.log,app.2025-12-29.1.log...
5. 测试日志输出
启动项目,访问:
http://localhost:8080/test/log
控制台输出(INFO 级别)
2025-12-29 20:30:15.123 [http-nio-8080-exec-1] INFO c.i.c.TestController - ======测试日志info级别打印===== 2025-12-29 20:30:15.124 [http-nio-8080-exec-1] ERROR c.i.c.TestController - =====测试日志error级别打印==== 2025-12-29 20:30:15.125 [http-nio-8080-exec-1] WARN c.i.c.TestController - ======测试日志warn级别打印===== 2025-12-29 20:30:15.126 [http-nio-8080-exec-1] INFO c.i.c.TestController - ======倪升武的个人博客:blog.itcodai.com;倪升武的CSDN博客:blog.csdn.net/eson_15
🔍 注意:
DEBUG日志未输出,因为当前级别为INFO。
同时,可在 D:/logs/course03/ 目录下看到生成的日志文件。
6. 总结与最佳实践
| 项目 | 建议 |
| 日志框架 | ✅ 使用 SLF4J + Logback(Spring Boot 默认) |
| 代码写法 | ✅ LoggerFactory.getLogger(类名.class) + {} 占位符 |
| 日志级别 | 开发:DEBUG;生产:INFO 或 WARN |
| 日志文件 | ✅ 按天+大小滚动,保留 7~30 天 |
| 敏感信息 | ❌ 禁止记录密码、身份证、手机号等 |
| 异常日志 | ✅ 使用 logger.error("消息", exception) 记录堆栈 |
🎯 记住:日志是系统的眼睛。良好的日志设计,能让故障排查效率提升 10 倍!