为何阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API

做为Java程序员,我想不少人都知道日志对于一个程序的重要性,尤为是Web应用。不少时候,日志多是咱们了解应用程序如何执行的惟一方式。java

因此,日志在Java Web应用中相当重要,可是,不少人却觉得日志输出只是一件简单的事情,因此会常常忽略和日志相关的问题。程序员

在接下来的几篇文章中,我会来介绍介绍这个容易被你们忽视,但同时也容易致使故障的知识点。sql

Java语言之因此强大,就是由于他很成熟的生态体系。包括日志这一功能,就有不少成熟的开源框架能够被直接使用。编程

首先,咱们先来看一下目前有哪些框架被普遍的使用。服务器

经常使用日志框架

j.u.l架构

j.u.l是java.util.logging包的简称,是JDK在1.4版本中引入的Java原生日志框架。Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST。并发

Log4j框架

Log4j是Apache的一个开源项目,经过使用Log4j,咱们能够控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;咱们也能够控制每一条日志的输出格式;分布式

经过定义每一条日志信息的级别,咱们可以更加细致地控制日志的生成过程。Log4也有七种日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG和TRACE。高并发

最使人感兴趣的就是,这些能够经过一个配置文件来灵活地进行配置,而不须要修改应用的代码。

LogBack

LogBack也是一个很成熟的日志框架,其实LogBack和Log4j出自一我的之手,这我的就是Ceki Gülcü。

logback当前分红三个模块:logback-core,logback- classic和logback-access。

logback-core是其它两个模块的基础模块。

logback-classic是Log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你能够很方便地更换成其它日记系统如Log4j或j.u.l。

logback-access访问模块与Servlet容器集成提供经过Http来访问日记的功能。

Log4j2

前面介绍过Log4j,这里要单独介绍一下Log4j2,之因此要单独拿出来讲,而没有和Log4j放在一块儿介绍,是由于做者认为,Log4j2已经不只仅是Log4j的一个升级版本了,而是从头至尾被重写的,这能够认为这其实就是彻底不一样的两个框架。

关于Log4j2解决了Log4j的哪些问题,Log4j2相比较于Log4j、j.u.l和logback有哪些优点,咱们在后续的文章中介绍。

禁止直接使用Log框架API?

前面介绍了四种日志框架,也就是说,咱们想要在应用中打印日志的时候,可使用以上四种类库中的任意一种。好比想要使用Log4j,那么只要依赖Log4j的jar包,配置好配置文件而且在代码中使用其API打印日志就能够了。

不知道有多少人看过《阿里巴巴Java开发手册》,其中有一条规范作了『强制』要求:

说好了以上四种经常使用的日志框架是给Java应用提供的方便进行记录日志的,那为何又不让在应用中直接使用其API呢?这里面推崇使用的SLF4J是什么呢?所谓的门面模式又是什么东西呢?

什么是日志门面

 

日志门面,是门面模式的一个典型的应用。

门面模式(Facade Pattern),也称之为外观模式,其核心为:外部与一个子系统的通讯必须经过一个统一的外观对象进行,使得子系统更易于使用。

就像前面介绍的几种日志框架同样,每一种日志框架都有本身单独的API,要使用对应的框架就要使用其对应的API,这就大大的增长应用程序代码对于日志框架的耦合性。

为了解决这个问题,就是在日志框架和应用程序之间架设一个沟通的桥梁,对于应用程序来讲,不管底层的日志框架如何变,都不须要有任何感知。只要门面服务作的足够好,随意换另一个日志框架,应用程序不须要修改任意一行代码,就能够直接上线。

在软件开发领域有这样一句话:计算机科学领域的任何问题均可以经过增长一个间接的中间层来解决。而门面模式就是对于这句话的典型实践。

为何须要日志门面

 

前面提到过一个重要的缘由,就是为了在应用中屏蔽掉底层日志框架的具体实现。这样的话,即便有一天要更换代码的日志框架,只须要修改jar包,最多再改改日志输出相关的配置文件就能够了。这就是解除了应用和日志框架之间的耦合。

有人或许会问了,若是我换了日志框架了,应用是不须要改了,那日志门面不仍是须要改的吗?

要回答这个问题,咱们先来举一个例子,再把门面模式揉碎了从新解释一遍。

 


同理,对于一个设计的全面、完善的日志门面来讲,他也应该是自然就兼容了多种日志框架的。因此,底层框架的更换,日志门面几乎不须要改动。

以上,就是日志门面的一个比较重要的好处——解耦

经常使用日志门面

介绍过了日志门面的概念和好处以后,咱们看看Java生态体系中有哪些好的日志门面的实现可供选择。

SLF4J

Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,之外观模式实现。能够在软件部署的时候决定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及logback等框架。以MIT 受权方式发布。

SLF4J 的做者就是 Log4j和Logback 的做者 Ceki Gülcü,他宣称 SLF4J 比 Log4j 更有效率,并且比 Apache Commons Logging (JCL) 简单、稳定。

其实,SLF4J其实只是一个门面服务而已,他并非真正的日志框架,真正的日志的输出相关的实现仍是要依赖Log4j、logback等日志框架的。

因为SLF4J比较经常使用,这里多用一些篇幅,再来简单分析一下SLF4J,主要和Log4J作一下对比。相比较于Log4J的API,SLF4J有如下几点优点:

·Log4j 提供 TRACE, DEBUG, INFO, WARN, ERROR 及 FATAL 六种纪录等级,可是 SLF4J 认为 ERROR 与 FATAL 并无实质上的差异,因此拿掉了 FATAL 等级,只剩下其余五种。

·大部分人在程序里面会去写logger.error(exception),其实这个时候Log4j会去把这个exception tostring。真正的写法应该是logger(message.exception);而SLF4J就不会使得程序员犯这个错误。

·Log4j间接的在鼓励程序员使用string相加的写法(这种写法是有性能问题的),而SLF4J就不会有这个问题 ,你可使用logger.error(“{} is+serviceid”,serviceid);

·使用SLF4J能够方便的使用其提供的各类集体的实现的jar。(相似commons-logger)

·从commons–logger和Log4j merge很是方便,SLF4J也提供了一个swing的tools来帮助你们完成这个merge。

·SLF4J 只支持 MDC,不支持 NDC。

·提供字串内容替换的功能,会比较有效率,说明以下:

 

commons-logging

Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其余工具包的编程模型。它经过其余一些工具提供API,日志实现和包装器实现。

commons-logging和SLF4J的功能是相似的,主要是用来作日志 门面的。提供更加好友的API工具。

总结

在Java生态体系中,围绕着日志,有不少成熟的解决方案。关于日志输出,主要有两类工具。

一类是日志框架,主要用来进行日志的输出的,好比输出到哪一个文件,日志格式如何等。 另一类是日志门面,主要一套通用的API,用来屏蔽各个日志框架之间的差别的。

因此,对于Java工程师来讲,关于日志工具的使用,最佳实践就是在应用中使用如Log4j + SLF4J 这样的组合来进行日志输出

这样作的最大好处,就是业务层的开发不须要关心底层日志框架的实现及细节,在编码的时候也不须要考虑往后更换框架所带来的成本。这也是门面模式所带来的好处。

综上,请不要在你的Java代码中出现任何Log4j等日志框架的API的使用,而是应该直接使用SLF4J这种日志门面。

欢迎工做一到五年的Java工程师朋友们加入Java填坑之路:8  6  0  1  1  3  4  8  1

里面提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!

相关文章
相关标签/搜索