自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么阿里巴巴禁止工程師直接使用日志系統(tǒng)(Log4j、Logback)中的 API

開發(fā) 開發(fā)工具
作為Java程序員,我想很多人都知道日志對于一個程序的重要性,尤其是Web應用。很多時候,日志可能是我們了解應用程序如何執(zhí)行的唯一方式。

 作為Java程序員,我想很多人都知道日志對于一個程序的重要性,尤其是Web應用。很多時候,日志可能是我們了解應用程序如何執(zhí)行的唯一方式。

所以,日志在Java Web應用中至關重要,但是,很多人卻以為日志輸出只是一件簡單的事情,所以會經(jīng)常忽略和日志相關的問題。

在接下來的幾篇文章中,我會來介紹介紹這個容易被大家忽視,但同時也容易導致故障的知識點。

Java語言之所以強大,就是因為他很成熟的生態(tài)體系。包括日志這一功能,就有很多成熟的開源框架可以被直接使用。

首先,我們先來看一下目前有哪些框架被廣泛的使用。

常用日志框架

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完整實現(xiàn)SLF4J API使你可以很方便地更換成其它日記系統(tǒng)如Log4j或j.u.l。

logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日記的功能。

Log4j2

前面介紹過Log4j,這里要單獨介紹一下Log4j2,之所以要單獨拿出來說,而沒有和Log4j放在一起介紹,是因為作者認為,Log4j2已經(jīng)不僅僅是Log4j的一個升級版本了,而是從頭到尾被重寫的,這可以認為這其實就是完全不同的兩個框架。

關于Log4j2解決了Log4j的哪些問題,Log4j2相比較于Log4j、j.u.l和logback有哪些優(yōu)勢,我們在后續(xù)的文章中介紹。

禁止直接使用Log框架API?

前面介紹了四種日志框架,也就是說,我們想要在應用中打印日志的時候,可以使用以上四種類庫中的任意一種。比如想要使用Log4j,那么只要依賴Log4j的jar包,配置好配置文件并且在代碼中使用其API打印日志就可以了。

 

不知道有多少人看過《阿里巴巴Java開發(fā)手冊》,其中有一條規(guī)范做了『強制』要求:

說好了以上四種常用的日志框架是給Java應用提供的方便進行記錄日志的,那為什么又不讓在應用中直接使用其API呢?這里面推崇使用的SLF4J是什么呢?所謂的門面模式又是什么東西呢?

什么是日志門面

日志門面,是門面模式的一個典型的應用。

門面模式(Facade Pattern),也稱之為外觀模式,其核心為:外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的外觀對象進行,使得子系統(tǒng)更易于使用。

 

就像前面介紹的幾種日志框架一樣,每一種日志框架都有自己單獨的API,要使用對應的框架就要使用其對應的API,這就大大的增加應用程序代碼對于日志框架的耦合性。

為了解決這個問題,就是在日志框架和應用程序之間架設一個溝通的橋梁,對于應用程序來說,無論底層的日志框架如何變,都不需要有任何感知。只要門面服務做的足夠好,隨意換另外一個日志框架,應用程序不需要修改任意一行代碼,就可以直接上線。

在軟件開發(fā)領域有這樣一句話:計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決。而門面模式就是對于這句話的典型實踐。

為什么需要日志門面

前面提到過一個重要的原因,就是為了在應用中屏蔽掉底層日志框架的具體實現(xiàn)。這樣的話,即使有一天要更換代碼的日志框架,只需要修改jar包,最多再改改日志輸出相關的配置文件就可以了。這就是解除了應用和日志框架之間的耦合。

有人或許會問了,如果我換了日志框架了,應用是不需要改了,那日志門面不還是需要改的嗎?

要回答這個問題,我們先來舉一個例子,再把門面模式揉碎了重新解釋一遍。

日志門面就像飯店的服務員,而日志框架就像是后廚的廚師。對于顧客這個應用來說,我到飯店點菜,我只需要告訴服務員我要一盤番茄炒蛋即可,我不關心后廚的所有事情。因為雖然主廚從把這道菜稱之為『番茄炒蛋』A廚師換成了把這道菜稱之為『西紅柿炒雞蛋』的B廚師。但是,顧客不需要關心,他只要下達『番茄炒蛋』的命令給到服務員,由服務員再去翻譯給廚師就可以了。

所以,對于一個了解了”番茄炒蛋的多種叫法”的服務員來說,無論后廚如何換廚師,他都能準確的幫用戶下單。

同理,對于一個設計的全面、完善的日志門面來說,他也應該是天然就兼容了多種日志框架的。所以,底層框架的更換,日志門面幾乎不需要改動。

以上,就是日志門面的一個比較重要的好處——解耦。

常用日志門面

介紹過了日志門面的概念和好處之后,我們看看Java生態(tài)體系中有哪些好的日志門面的實現(xiàn)可供選擇。

SLF4J

Java簡易日志門面(Simple Logging Facade for Java,縮寫SLF4J),是一套包裝Logging 框架的界面程式,以外觀模式實現(xiàn)??梢栽谲浖渴鸬臅r候決定要使用的 Logging 框架,目前主要支援的有Java Logging API、Log4j及l(fā)ogback等框架。以MIT 授權方式發(fā)布。

SLF4J 的作者就是 Log4j和Logback 的作者 Ceki Gülcü,他宣稱 SLF4J 比 Log4j 更有效率,而且比 Apache Commons Logging (JCL) 簡單、穩(wěn)定。

其實,SLF4J其實只是一個門面服務而已,他并不是真正的日志框架,真正的日志的輸出相關的實現(xiàn)還是要依賴Log4j、logback等日志框架的。

由于SLF4J比較常用,這里多用一些篇幅,再來簡單分析一下SLF4J,主要和Log4J做一下對比。相比較于Log4J的API,SLF4J有以下幾點優(yōu)勢:

  • 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可以方便的使用其提供的各種集體的實現(xiàn)的jar。(類似commons-logger)
  • 從commons–logger和Log4j merge非常方便,SLF4J也提供了一個swing的tools來幫助大家完成這個merge。
  • SLF4J 只支持 MDC,不支持 NDC。
  • 提供字串內容替換的功能,會比較有效率,說明如下:
  1. // 傳統(tǒng)的字符串產(chǎn)生方式,如果沒有要記錄Debug等級的信息,就會浪費時間在產(chǎn)生不必要的信息上 
  2. logger.debug("There are now " + count + " user accounts: " + userAccountList); 
  3.  
  4. // 為了避免上述問題,我們可以先檢查是不是開啟了Debug信息記錄功能,只是程序的編碼會比較復雜 
  5. if (logger.isDebugEnabled()) { 
  6.    logger.debug("There are now " + count + " user accounts: " + userAccountList); 
  7.  
  8. // 如果Debug等級沒有開啟,則不會產(chǎn)生不必要的字符串,同時也能保持程序編碼的簡潔 
  9. logger.debug("There are now {} user accounts: {}"count, userAccountList); 

commons-logging

Apache Commons Logging是一個基于Java的日志記錄實用程序,是用于日志記錄和其他工具包的編程模型。它通過其他一些工具提供API,日志實現(xiàn)和包裝器實現(xiàn)。

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

總結

在Java生態(tài)體系中,圍繞著日志,有很多成熟的解決方案。關于日志輸出,主要有兩類工具。

一類是日志框架,主要用來進行日志的輸出的,比如輸出到哪個文件,日志格式如何等。 另外一類是日志門面,主要一套通用的API,用來屏蔽各個日志框架之間的差異的。

所以,對于Java工程師來說,關于日志工具的使用,***實踐就是在應用中使用如Log4j + SLF4J 這樣的組合來進行日志輸出。

這樣做的***好處,就是業(yè)務層的開發(fā)不需要關心底層日志框架的實現(xiàn)及細節(jié),在編碼的時候也不需要考慮日后更換框架所帶來的成本。這也是門面模式所帶來的好處。

綜上,請不要在你的Java代碼中出現(xiàn)任何Log4j等日志框架的API的使用,而是應該直接使用SLF4J這種日志門面。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2021-03-15 18:47:25

日志開發(fā)源碼

2021-06-03 10:58:16

logbacklog4jJava

2020-01-07 10:06:26

Slf4jLog4JLogback

2021-08-04 17:20:30

阿里巴巴AsyncJava

2020-09-08 16:25:18

Apache BeancopyJava

2020-07-30 12:16:33

阿里巴巴Apache對象

2020-09-22 11:40:53

BigDecimalequalsJava

2022-09-05 10:06:21

MySQL外循環(huán)內循環(huán)

2025-04-17 08:47:23

2025-01-14 01:00:00

日志接口Log4j

2019-06-26 07:54:53

ArrayListsubList源碼

2013-05-21 10:58:43

Log4jActiveMQSpring

2020-10-27 08:24:45

阿里巴巴SLF4J

2018-10-16 15:34:17

阿里巴巴Apache Flin大數(shù)據(jù)

2017-12-12 16:24:57

工程師代碼阿里巴巴

2020-09-14 09:47:56

Java開發(fā)類型

2012-06-20 10:15:21

技術風云會

2009-07-08 14:33:46

Java日志框架Log4J

2013-08-22 09:26:38

去IOE王堅
點贊
收藏

51CTO技術棧公眾號