`

为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 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-loggingApache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型。它通过其他一些工具提供API,日志实现和包装器实现。

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

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

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

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

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

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

 

 

 

 

from http://www.techug.com/post/log4j-logback-facade-pattern.html

分享到:
评论

相关推荐

    日志 log4j-slf4j+logback1.3.0

    总的来说,"log4j-slf4j+logback1.3.0"的组合提供了一个强大、灵活的日志解决方案,允许开发者使用统一的API进行日志记录,同时利用Logback的高性能和丰富特性。通过正确配置这些组件,开发者可以轻松管理和优化Java...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`Jackson`的日志脱敏实现源码,提供了多种实现方式,旨在帮助开发者在保障信息安全的同时,充分利用日志进行系统分析。 1. **基于正则表达式的日志脱敏实现...

    log4j logback slf4j

    SLF4J是一个日志抽象层,它为各种日志框架提供了统一的接口,如Log4j、Logback、Java内置的日志系统等。其目的是使用户可以在不修改代码的情况下,自由地切换日志实现。SLF4J的API设计简洁,使用方便,只需导入对应...

    《〈Java开发手册(泰山版)〉灵魂13问》.zip

    为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback) 中的API? 66 为什么阿里巴巴禁止把SimpleDateFormat定义成static变量?74 为什么阿里巴巴禁止开发人员使用isSuccess作为变量名?85 为什么阿里巴巴禁止...

    面试灵魂13问.zip

    为什么阿里巴巴禁止工程师直接使用日志系统 (Log4j、Logback) 中的 API ? 66 为什么阿里巴巴禁止把 SimpleDateFormat 定义成 static 变量? 74 为什么阿里巴巴禁止开发人员使用 isSuccess 作为变量名? 85 为...

    十个 log4j 转移到LogBack的理由

    本文将探讨十个理由,解释为什么你应该从 log4j 迁移到 LogBack。 1. **性能提升**:LogBack 在设计时考虑了性能优化,比 log4j 更快、更小巧,同时提供更高的效率,这意味着它能以更低的资源消耗提供更好的日志...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 Slf4j是简单的日志外观(Facade)模式,它提供了统一的日志接口,使得用户可以选择不同的日志实现。Slf4j的出现使得日志系统的开发变得更加灵活和便捷。Log4j2...

    Mybatis日志Log4j与Logback.pdf

    Mybatis日志系统涉及到两种主要的日志框架:Log4j和Logback。Log4j是早期流行的Java日志记录框架,但随着技术的发展,它的1.x版本在性能和并发性方面逐渐暴露出一些局限性,并且已经不再维护。Logback是Log4j的创始...

    slf4j+logback 于log4j+commons-logging大PK

    Logback则是由Log4j的创始人Ceki Gülcü设计的一个更现代、更高效的日志系统。它被设计为比Log4j更快,同时提供了更丰富的配置选项和更好的性能。Logback分为三个组件:ch.qos.logback.core(核心库),ch.qos....

    Logback 实例,log4,slf4,logback日志输出 demo

    SLF4J是一个日志抽象层,它为各种日志实现(如logback和log4j)提供了一个统一的API。这样做的好处在于,开发者可以在不修改代码的情况下切换不同的日志实现,提高了代码的可移植性和灵活性。 **Logback:高效日志...

    log4j 和 logback配置资源

    Log4j和Logback是两个广泛使用的日志框架,它们为Java应用程序提供了强大的日志处理能力。 Log4j,由Apache软件基金会开发,是一款功能丰富的日志API,它允许程序员以灵活的方式控制日志信息的输出。Log4j的核心...

    Log4j api 下载

    - Logback:由SLF4J作者开发的日志框架,性能优于Log4j,但API不完全兼容。 总的来说,Log4j 提供了一套强大且可定制的日志解决方案,通过下载和正确配置,开发者可以在各种Java应用中充分利用其功能。利用提供的...

    logback-slf4j日志配置文件-下载即可使用

    "logback-slf4j日志配置文件下载即可使用" logback-slf4j是Java领域中一种常用的日志记录解决方案,它通过结合slf4j(Simple Logging Facade for Java)来提供了异步日志输出的功能,能够将日志输出到不同的文件中...

    logback+self4j 进行日志记录

    Logback 和 SLF4J(Simple Logging Facade for Java)是Java世界中广泛使用的日志框架,它们配合使用可以提供高效、灵活的日志管理方案。本文将详细介绍如何使用logback-test.xml配置文件进行日志记录,并通过一个...

    slf4j-log4j12-1.7.12.jar、slf4j-api-1.7.12.jar

    SLF4J提供了一种机制,通过在类路径中放置特殊的“禁止”JAR(如jul-to-slf4j.jar),可以防止Java Util Logging(JUL)等其他日志框架的直接使用,从而保持日志系统的统一。 标签"slf4j"表明了这两个JAR文件与SLF4...

    log4j-1.2.17.jar、slf4j-api-1.7.21.jar、slf4j-log4j12-1.7.2.jar

    总之,`log4j-1.2.17.jar`、`slf4j-api-1.7.21.jar`和`slf4j-log4j12-1.7.2.jar`是Java开发中用于日志管理的关键组件,它们在Hibernate和Spring框架的使用中起到桥梁和接口的作用,确保了日志系统的灵活性和可扩展性...

    tomcat9 slf4j+log4j2 写日志.zip

    3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    SLF4J是一个抽象层,为各种日志框架提供了统一的API,如Logback、Log4j等。它的主要优点在于可以让你在不修改代码的情况下更换底层的日志框架,只需改变类路径上的绑定即可。SLF4J提供了丰富的日志级别,如DEBUG、...

    log4j,log4j2,logback 日志插件的使用例子

    2. log4j2 的配置详解,JDBC 配置,CloseableThreadContext 的使用(自定义输出日志文件 例如 logback MDC) 3.logback 的XML配置与使用,MDC的使用,SiftingAppender,DBAppender(c3p0,druid) 详细查看代码:README.md ...

    log4j-2.11.2的jar包和日志门面slf4j的jar包

    在提供的`log4j-core-2.11.2.jar`和`log4j-api-2.11.2.jar`中,`log4j-core`是实现部分,包含了各种日志记录功能,如配置解析、日志事件的处理等;而`log4j-api`则包含API接口,供开发者在代码中调用,定义日志级别...

Global site tag (gtag.js) - Google Analytics