SLF4J 使用详细
1. 问题场景
场景:在项目中引用一个第三方依赖时,启动应用程序报多日志桥接器错误,经问题排查发现第三方依赖包含非SLF4J桥接器(本项目中使用SLF4J日志门面框架)。
解决:将JCL的调整至SLF4J,具体明细见官网。
官网:
“http://www.slf4j.org/manual.html#swapping” “http://www.slf4j.org/legacy.html”
2. SLF4J流程调用
2.1 SLF4J与日志实现框架调用
简单调用图
2.2 简单描述
应用程序通过调用SLF4J API 实现对具体日志框架的使用,中间经过桥接器进行适配不同的日志实现(log4j、jul、logback、nop等)。
其中logback与SLF4J是同组织实现,可直接SLF4J调用而不需要桥接器。
2.3 从JCL迁移至SLF4J
如上图所示,可根据实际情况调整依赖包(log4j-over-slf4j.jar),做到直接迁移使用SLF4J日志门面接口。
2.4 通过SLF4J 调用JCL
两者属于同层级,仅为解决项目中必须使用JCL框架时,可通过引用依赖包,通过SLF4J对JCL的直接调用
“http://www.slf4j.org/legacy.html”
3.日志使用
3.1 日志中的占位符使用
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
3.2 典型使用
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
private Integer t;
private Integer oldT;
public void setTemperature(Integer temperature) {
oldT = t;
t = temperature;
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
if (temperature > 50) {
logger.info("Temperature has risen above 50 degrees {}.", t);
}
}
public static void main(String[] args) {
logger.info("hello word!");
TestController testController = new TestController();
testController.setTemperature(500);
}
}
PS:本文未详细叙述底层实现原理,仅仅阅读SLF4J获取Logger源码,具体日志实现框架源码未涉猎,仅作为个人对SLF4J使用流程记录。