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