当前位置:网站首页>阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密,我搞清楚了
阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密,我搞清楚了
2020-11-10 12:02:00 【程序猿欧文】
之前已经详细、全面地介绍了 Log4j,相信小伙伴们已经完全掌握了。那我在读嵩山版的阿里巴巴开发手册(没有的小伙伴,记着找我要)的时候,就发现了一条「强制」性质的日志规约:
应用中不可以直接使用日志系统(Log4j、Logback)中的 API,而应该使用日志框架中的 API,比如说 SLF4J,使用门面模式的日志框架,有利于维护和统一各个类的日志处理方式。
(为什么我把这段文字手敲了下来呢,因为我发现阿里巴巴开发手册上的有语病,瞧下面红色标出的部分)

(维护和统一,把统一放在最后面读起来真的是别扭,和的有点牵强,请问手册的小编是数学老师教的语文吧?)

那看到这条强制性的规约,我就忍不住想要问:“为什么阿里巴巴开发手册会强制使用 SLF4J 作为 Log4J 的门面担当呢?”究竟这背后藏了什么“不可告人”的秘密?
(请小伙伴们自行配上 CCTV 12 台的那种 BGM)
PS:顺带给小伙伴们普及一点小知识,阿里巴巴开发手册上出现的 Jakarta 其实是 Apache 软件基金会下的一个开源项目。其实 Commons 是以前隶属于 Jakarta,现在是作为 Apache 下的一个单独项目,阿里巴巴开发手册上的描述已经不太恰当了,换成是 Apache Commons Logging 会更合适一点。
(忍不住又给阿里巴巴开发手册挑了一个毛病,请原谅我“一丝不苟”的做事态度)
01、SLF4J 是什么
SLF4J 是 Simple Logging Facade for Java 的缩写(for≈4),也就是简易的日志门面,以外观模式(Facade pattern,一种设计模式,为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)实现,支持 java.util.logging、Log4J 和 Logback。
SLF4J 的作者就是 Log4J 和 Logback 的作者,他的 GitHub 主页长下面这样:

一股秋风瑟瑟的清冷感扑面而来,有没有?可能巨佬不屑于维护他的 GitHub 主页吧?我的 GitHub 主页够凄惨了,没想到巨佬比我还惨,终于可以吹牛逼地说,“我,沉默王二,GitHub 主页比 SLF4J、Log4J 和 Logback 的作者 Ceki Gulcu 绿多了。。。。。。”

1996 年初,欧洲安全电子市场项目决定编写自己的跟踪 API,最后该 API 演变成了 Log4j,已经推出就备受宠爱。
2002 年 2 月,Sun 推出了自己的日志包 java.util.logging(可称 JUL),据说实现思想借鉴了 Log4j,毕竟此时的 Log4j 已经很成熟了。
2002 年 8 月,Apache 就推出了自己的日志包,也就是阿里巴巴开发手册上提到的 JCL(Jakarta Commons Logging)。JCL 的野心很大,它在 JUL 和 Log4j 的基础上提供了一个抽象层的接口,方便使用者在 JUL 和 Log4j 之间切换。

但 JCL 好像并不怎么招人喜欢,有人是这样抱怨的:

Ceki Gulcu 也觉得 JCL 不好,要不然他也不会在 2005 年自己撸一个名叫 SLF4J 的新项目,对吧?但出来混总是要付出代价的,SLF4J 只有接口,没有实现,总不能强逼着 Java 和 Apache 去实现 SLF4J 接口吧?这太难了,不现实。
但巨佬之所以称之为巨佬,是因为他拥有超出普通人的惊人之处,他在 SLF4J 和 JUL、Log4j、JCL 之间搭了三座桥:

巨佬动手,丰衣足食,有没有?狠起来连自己的 Log4j 都搭个桥。
面对巨佬的霸气,我只想弱弱地说一句,“ SLF4J 这个门面担当,你以为好当的啊?”
02、SLF4J 解决了什么痛点
春秋战国的时候,每个国家都有自己的货币,用别国的货币也不合适,对吧?那在发生贸易的时候就比较麻烦了,货币不统一,就没法直接交易,因为货币可能不等价。
那秦始皇统一六国后,就推出了新的货币政策,全国都用一种货币,那之前的问题就解决掉了。
你看,同样的道理,日志系统有 JUL、JCL,Ceki Gulcu 自己又写了 2 种,Log4j 和 Logback,各有各的优缺点,再加上使用者千千万,萝卜白菜各有所爱,这就导致不同的应用可能会用不同的日志系统。
假设我们正在开发一套系统,打算用 SLF4J 作为门面,Log4j 作为日志系统,我们在项目中使用了 A 框架,而 A 框架的门面是 JCL,日志系统是 JUL,那就相等于要维护两套日志系统,对吧?

这就难受了!
Ceki Gulcu 想到了这个问题,并且帮我们解决了!来看 SLF4J 官网给出的解决方案。

- 使用 jcl-over-slf4j.jar 替换 commons-logging.jar
- 引入 jul-to-slf4j.jar
为了模拟这个过程,我们来建一个使用 JCL 的项目。
第一步,在 pom.
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
第二步,新建测试类:
package com.itwanger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author 微信搜「沉默王二」,回复关键字 PDF
*/
public class Demo {
private static Log logger = LogFactory.getLog(Demo.class);
public static void main(String[] args) {
logger.info("jcl");
}
}
该类会通过 LogFactory 获取一个 Log 对象,并且使用 info()
方法打印一行日志。
调试这段代码的过程中你会发现,Log 的实现有四种:

如果没有绑定 Log4j 的话,就会默认选择 Jdk14Logger——它返回的 Logger 对象,正是 java.util.logging.Logger,也就是 JUL。
因此,就可以在控制台看到以下信息:
10月 21, 2020 3:13:30 下午 com.itwanger.Demo main
信息: jcl
怎么把使用 JCL 的项目改造成使用 SLF4J 的呢?
第三步,使用 jcl-over-slf4j.jar 替换 commons-logging.jar,并加入 jul-to-slf4j.jar、slf4j-log4j12.jar(会自动引入 slf4j-api.jar 和 log4j.jar):
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.29</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
第四步,在 resources 目录下创建 log4j.properties 文件,内容如下所示:
### 设置###
log4j.rootLogger = debug,stdout,D
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layou.........
版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4711059
边栏推荐
- What should micro service authorization do?
- Use Python to guess which numbers in the set are added to get the sum of a number
- Magicodes.IE 3.0重磅设计畅谈
- Why should small and medium sized enterprises use CRM system
- 2020CCFBDCI训练赛之室内用户时序数据分类baseline
- Sign in with apple
- 8. Parameter verification
- How to view the establishment of the new retail business department of Alibaba cloud?
- Common skills of JS array
- Leetcode: binary tree (4)
猜你喜欢
ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
基于FPGA的MCP4725驱动程序
Come on! Hungry? Software testing Python automation post core interview questions out, how many will you come down the whole process?
专业之旅——GitHub 热点速览 Vol.45
The use of Python PIP command
接口测试的时候如何生成随机数据进行测试
Indoor user time series data classification baseline of 2020 ccfbdci training competition
What should be paid attention to when designing API to get data through post
Sign in with apple
SEO界,值得收藏的10条金玉良言有哪些?
随机推荐
Leetcode 5561. Get the maximum value in the generated array
2013-2019年“一带一路”沿线国家在华投资量 - 知乎
Android network performance monitoring scheme
用”软删除“来删除数据库中的数据
Alibaba development manual mandatory use of slf4j as the secret of the facade, I understand
Design mode (8) -- command mode
How long can the flower pig still be fragrant?
[C.NET] 11: the most basic thread knowledge
2013-2019 years one belt, one road, the amount of investment in China
Exploration and practice of Tencent cloud tbase in the field of distributed HTAP
Data structure adjacency multiple table (C language implementation)
Sign in with apple
Shop notes
双十一秒杀系统这你抢得过吗?
腾讯云TBase在分布式HTAP领域的探索与实践
Swoole 如何使用 Xdebug 进行单步调试
layer.prompt(options, yes) - 输入层
The backup and recovery of XFS file system under centos7: full backup, incremental backup and differential backup
jsliang 求职系列 - 09 - 手写浅拷贝和深拷贝
想花钱速学互联网行业,大概花两三个月的时间,出来好找工作吗