文章目录
- 前言
- 实验
- 原理
- 后记
前言
- 背景
项目依赖了三方包,三方包有日志打印的代码。需要将三方包的日志打出来。 - 问题
是怎么做到项目的日志格式和依赖中的日志格式保持一致的? - 结论
查阅资料后,发现是slf4j
帮忙做了桥接。这里做下记录。
实验
-
git 仓库
- starter 使用 log4j,暴露给主项目依赖
- 主项目使用 logback (slf4j 的api), 依赖上文的starter项目
-
测试用例
@SpringBootTest(classes = App.class)
@RunWith(SpringRunner.class)
public class AppTest {/*** slf4j 的api获取logger, 默认的实现是 logback*/Logger logger = LoggerFactory.getLogger(AppTest.class);@Resourceprivate StarterService service;@Testpublic void testLog() {// 自己项目的日志logger.info("这是来自主项目的日志,使用slf4j的api进行日志打印");// 三方包的日志service.doSomething();}
}
原理
参考 slf4j 的官网,slf4j 在上例中起了两个作用
log4j-to-slf4j
提供了一组桥接器(bridge)实现,可以将Log4j 的日志事件转发到SLF4J,从而使得原本使用Log4j 的代码能够无缝地迁移到使用SLF4J。这个依赖是由 spring-boot-starrter-logging
传递依赖带进来的,所以主项目自动获得了该桥接器的能力。
后记
- 项目尽量使用 slf4j 获取logger,让上层不依赖具体的日志实现,由使用方决定。特别适合 Spring Boot 的集成方式。当需要替换日志框架时不用改变应用层代码。
/*** slf4j 的api获取logger, 默认的实现是 logback*/Logger logger = LoggerFactory.getLogger(AppTest.class);
- Spring Boot 自带的 slf4j 桥接api帮我们解决了依赖的日志打印问题,来自于
spring-boot-starter-logging