开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
1、SLF4J的原理和实践
在前面提到过Java中的日志框架(日志框架总结),但那篇文章只是将当前混乱的日志框架做了一个梳理,这篇文章则对 SLF4J 这一主要门面日志框架的原理做了介绍,更深入的理解日志框架;
1.1、Java中的日志框架
首先以Java为例,看一下Java开发中使用到的日志框架都有哪些;
Java日志框架预览:slf4j、log4j、log4j2、reload4j、logback、jcl、jul等;
1.1.1、什么是门面日志框架?
门面日志框架可以理解为提供日志服务的统一API接口,并不涉及到具体的业务逻辑实现,例如SLF4J、JCL等,相当于Java SPI中的Service;底层日志框架则是门面日志框架的具体业务逻辑实现,实现了统一API接口的方法,相当于Java SPI中的Service Provider。
1.1.2、没有门面日志框架的情况
不同日志框架的API接口和配置文件不同,应用程序在使用日志框架时往往需要针对不同的日志框架来修改应用代码,不利于软件的开发、维护,代码耦合性高。
如果多个日志框架共存,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件,如下),且不能使用第三方组件维护配置文件。这是因为日志文件的路径、日志级别、日志格式等等,只能有应用程序本身来进行维护。最坏的情况下,有可能需要在应用程序中维护好几套内容相同但格式不同的配置文件。
1.1.3、引入门面日志框架的情况
引入门面日志框架之后,应用程序和日志框架(框架的具体实现)之间有了统一的API接口(门面日志框架实现),此时应用程序只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码。
应用门面日志框架的流程,如下:
1.2、SLF4J的概念与实践
1.2.1、SLF4J概念
SLF4J: 全称是 Simple Logging Facade for Java
翻译为中文,即“Java的简单日志门面,是现在Java生态中最流行的一个门面日志框架;
红框模块中绑定的含义是指SLF4J会把请求转发给该jar包。
适配层是为了适配一些没有实现SLF4J-API的底层日志框架,即仍然能够使用SLF4J的API接口调用该底层日志框架。
1.2.2、SLF4J实例
实例一:logback
这里需要导入slf4j-api和logback-classic,因为用到了slf4j的API接口和logback的具体实现。
实例二:reload4j
reload4j并不是基于SLF4J的API实现的,所以需要通过适配器进行转化,因此需要将适配层的依赖包一同导入,才能够使用。
reload4j没有默认的日志配置,所以需要在项目中增加日志配置。
实例一与实例二使用了两个完全不同的底层日志文件实现,但是是统一的SLF4J的API接口,所以不需要修改应用程序中的代码。
1.2.3、SLF4J使用小结
使用步骤:
- 引入 Jar 包 slf4j-api.jar;
- 引入适配层的 Jar 包(如果需要的话);
- 引入底层日志框架的 Jar 包;
- 确认是否是安全版本(最近出现了多个与日志框架相关的安全漏洞请务必确认所使用的版本为安全版本);
- 开始你的 SLF4J日志之旅
SLF4J与底层日志框架依赖关系小结:
1.3、SLF4J的实现原理
1.3.1、SLF4J1.7.x的实现原理
1.3.2、SLF4J1.8.x的实现原理
SLF4J1.8.x的实现基于Java SPI机制,建议学习Java SPI基本原理之后再“食用”,效果更佳;Java SPI的基础原理可参考:Java SPI基础原理
关于接口标准制定的题外话
- 谁掌握了话语权,谁就能制定接口标准;
- 在参与制定标准这块,目前华为是国内做得最好的;
- 希望新一代的程序员能发出更多的声音;