本系列第 2 篇。搞懂一个初学者最容易懵的问题:为什么代码里
import org.slf4j.Logger,配置的却是 Logback?
门面 vs 实现
- SLF4J:门面(接口/规范)。你的代码只依赖它,不绑定具体实现。
- Logback:实现(干活的)。真正决定日志打到哪、长什么样。
这是典型的“面向接口编程”。好处是:哪天想把 Logback 换成 log4j2,业务代码一行不用改,只换依赖和配置。
标准用法
importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassOrderService{privatestaticfinalLoggerlog=LoggerFactory.getLogger(OrderService.class);publicvoidcreate(){log.info("订单创建成功, id={}",123);// 用 {} 占位符,别用字符串拼接}}实际项目里更常用 Lombok 的
@Slf4j注解,自动帮你生成上面那行log字段,少写样板代码。
为什么用{}占位符而不是+拼接
log.debug("x="+obj);// ❌ 即使 debug 没开,字符串也已经拼好了(浪费)log.debug("x={}",obj);// ✅ 只有真要打印时才拼接在高频日志或大对象场景下,这个差异对性能影响明显。养成用占位符的习惯。
上一篇:为什么是 Logback
下一篇:三大核心组件 Logger / Appender / Encoder