什么是SLF4J?
SLF4J,是simple logging facade for java的缩写,翻译为java的简单日志外观。
SLF4J提供了Java中所有日志框架的简单抽象,服务于其他各种框架,比如:java.util.logging, logback and log4j。
按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
为什么要使用SLF4J?
Java程序员开发项目的时候,日志记录是一个非常重要的事情,可以记录运行时产生的参数或者错误的日志行为,以便于事后更好的发现问题和处理问题。
所以市面上就出现了很多日志框架,比如:如log4j,logback等框架,但是如果项目比较庞大时,可能每个服务所引用的日志框架都不一样,导致我们需要维护很多分配置文件,还有可能出现日志框架冲突问题。
为了解决这种问题我们选择引入一个日志管理接口”SLF4J”,它相当于一个接口,SLF4J负责加载各个模块的日志类库,就类似日志门面系统(Facade)。
SLF4J就是典型的日志门面系统(Facade),当我们需要打印日志时,可以直接调用SLF4J来进行日志打印,并且我们只用配置SLF4J就可以实现日志管理,不用考虑底层究竟是那个日志框架来生成。
SLF4J的实现原理
1.门面模式
SLF4J是门面模式的典型应用,因此在讲SLF4J前,我们先简单回顾一下门面模式,
门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。
用一张图来表示门面模式的结构,如下图所示:
门面模式的核心为Facade即门面对象,门面对象核心为几个点:
- 知道所有子角色的功能和责任;
- 将客户端发来的请求委派到子系统中,没有实际业务逻辑;
- 不参与子系统内业务逻辑的实现。
2.SLF4J原理图
SLF4J提供了统一的门面,由于历史或者其他原因,有些日志框架使用SLF4J是需要一个适配器,下图就是各框架使用SLF4J的整体概况:
从本质上来讲slf4j主要是通过不同的桥接器对接了不同的日志框架,具体的日志打印仍然由日志框架去实现。
SLF4J使用配置详解
第一步:我们先定义一个pom.xml,引入相关jar包。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.2.0</version> <scope>test</scope> </dependency>
第二步:安装一个lombok插件(只针对IDEA)。
下载到本地后,在IDEA中的seting->Plugins中,选择
找到下载的zip包,然后安装之后就把所有的准备工作做完了。
备注:IDEA 2020.3以及之后的版本内置了lombok插件,无需额外下载安装。
第三步:写一个单元测试类。
@Slf4j class LogTest { @Test void testLog() { String testInfo = "Free flying flowers are like dreams"; log.info("The test info is :{}", testInfo); } }
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》