SLF4J 是 Java 生态里一个日志组件
先搞懂"它不是日志框架,而是日志门面"
1. 先打基础:先搞懂它到底是什么
这一阶段目标只有一个:
分清楚这几个角色:
- SLF4J:日志接口 / 门面
- Logback / Log4j2:真正输出日志的实现
- 你的业务代码:只调用 SLF4J API
你先要建立这个认知:
业务代码 -> SLF4J API -> 日志实现(Logback / Log4j2)
这一层如果不清楚,后面一堆依赖冲突、日志不输出、多个 binding 警告,你都会觉得很玄学。
这一阶段你应该会回答这些问题:
- 为什么需要日志门面
- 为什么不直接写死 Log4j
- SLF4J 和 Logback 是什么关系
- "API"和"实现"分别指什么
2. 入门使用:会写最基本的日志代码
这一阶段开始动手,先别碰复杂配置,先会用。
你需要会这些内容:
2.1 创建 Logger
最基本写法:
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
private static final Logger log = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
log.info("程序启动");
log.warn("这是警告");
log.error("这是错误");
}
}
2.2 理解常见日志级别
按常见重要性理解就行:
trace:非常细的跟踪信息debug:调试信息info:正常运行信息warn:警告,但程序还能跑error:错误,功能可能失败
你需要知道:
- 开发环境常开
debug - 生产环境通常以
info或warn为主
2.3 学会参数化日志
这个很重要,属于 SLF4J 的高频写法:
java
log.info("用户 {} 登录成功,IP={}", username, ip);
而不是:
java
log.info("用户 " + username + " 登录成功,IP=" + ip);
原因是参数化写法:
- 可读性更好
- 性能更好
- 是 SLF4J 推荐方式
这一阶段练熟后,你基本就"会用 SLF4J"了。
3. 进阶理解:搞懂依赖关系和配置方式
这一阶段是从"会写"进化到"会排查问题"。
3.1 学会看依赖结构
你要理解项目里通常会有两类依赖:
API 依赖
slf4j-api
实现依赖
例如:
logback-classic
你最终需要形成一个习惯:
代码只面向 slf4j-api,运行时只保留一个日志实现。
3.2 理解"只能有一个实现"
很多初学者最容易踩的坑:
项目里同时出现:
- logback
- log4j
- slf4j-simple
然后控制台报:
Class path contains multiple SLF4J bindings
你要学会判断:
- 当前项目到底用了哪个实现
- 哪个依赖是多余的
- 谁是传递依赖带进来的
如果你会 Maven/Gradle,这一块要顺手学会:
- Maven:
dependency:tree - Gradle:
dependencies
这是 Java 项目里非常实用的能力。
3.3 学配置文件,但先学 Logback
因为 SLF4J 本身不负责输出,所以配置通常是配 Logback 或 Log4j2。
建议学习顺序先从 Logback 开始,因为它和 SLF4J 关系最紧。
先学最常见配置项:
- root 日志级别
- 指定包的日志级别
- 控制台输出
- 文件输出
- 日志格式 pattern
比如你要知道这些问题怎么解决:
- 为什么 debug 没出来
- 为什么某个包日志太多
- 为什么日志没写入文件
- 为什么输出格式很乱
4. 项目实战:把 SLF4J 真正用进业务里
这一阶段才是"学会"。
4.1 在 Spring Boot 项目里用
如果你做 Java 后端,最典型场景就是 Spring Boot。
Spring Boot 默认就会把日志体系整好,通常是:
- 代码写 SLF4J
- 底层默认是 Logback
你要学会:
- 在 Controller / Service / Repository 里正确打日志
- 区分业务日志、错误日志、调试日志
- 不要乱打日志
4.2 学会"日志该记什么,不该记什么"
这是工程能力,不只是语法。
应该记录:
- 关键业务节点
- 外部调用结果
- 异常上下文
- 重要参数(适度)
不该记录:
- 密码
- token
- 身份证号
- 银行卡号
- 过多无意义日志
很多人不是不会用日志,是不会"设计日志"。
4.3 学异常日志的正确写法
比如:
java
try {
int x = 1 / 0;
} catch (Exception e) {
log.error("计算失败", e);
}
而不是只写:
java
log.error("计算失败: {}", e.getMessage());
因为直接传异常对象,才能保留完整堆栈。
4.4 学会按场景打日志
比如:
接口入口
java
log.info("收到创建订单请求,userId={}, orderId={}", userId, orderId);
核心流程
java
log.debug("开始调用支付服务,orderId={}", orderId);
失败场景
java
log.error("支付失败,orderId={}", orderId, e);
这种"流程化日志思维"比记概念更重要。
推荐学习顺序
我建议你按这个顺序走:
第一周:只学概念 + 基本 API
- SLF4J 是什么
- 日志门面是什么
- Logger / LoggerFactory
- 5 个常见日志级别
- 参数化日志
第二周:学运行机制
- slf4j-api 和 logback-classic 的关系
- 为什么需要绑定
- 为什么只能有一个实现
- 多个 binding 冲突怎么排查
第三周:学配置
logback.xml- 控制台输出
- 文件输出
- 日志级别控制
- 包级别日志管理
第四周:项目实战
- 在 Spring Boot 中规范打日志
- 异常日志
- 接口日志
- 敏感信息脱敏
- 日志排错