「故事系列」小故事說清楚什麼是日誌框架

有天上飛的概念,就要有落地的實現html

大哥大姐新年好,點贊轉發不要少java

文本已收錄至GitHub開源倉庫 Lu_JavaNodes 碼雲倉庫地址Lu_JavaNodes ,包含教程涉及全部思惟導圖,案例代碼和後續講解視頻,歡迎Star增磚添瓦。git

本文閱讀技術要求:見過日誌程序員

沒見也不要慌,以下圖,這就是日誌,好了,你見過了。 github

一個小故事說清楚日誌框架

日誌的做用面試

  • 記錄系統中的操做
  • 記錄系統的運行情況
  • 系統錯誤時候,根據日誌分析緣由

故事開始

在一家IT企業中,項目經理虎大力(龍套) 正在指揮 程序員鹿小明(精英龍套)開發一個大型的增刪改查項目。爲了開發這個項目。項目組僅有的程序員鹿小明天天工做996spring

故事進入 V1.0 環節

one day,虎大力給鹿小明提出來一個新的需求,爲了更好的進行公司的信息化建設,虎大力想要看到代碼執行的狀況,執行到某個業務的時候在控制檯有所表示,例如:執行到查詢方法的時候,須要在控制檯上出現,這是一個打印方法的信息。設計模式

鹿小明一想,這好辦啊,原本本身爲了調試測試方便就寫過不少打印語句,如今無非更多而已。因而就加班加點在全部的增刪改查方法中都寫了System.out.println()打印語句。順利完成了這個工做。api

故事進入 V2.0 環節

一段時間歲月靜好框架

one day,虎大力找到鹿小明:你這個代碼裏面System.out.println()太多了,我須要你作成,測試時候顯示,上線以後不顯示。你去搞一下。

鹿小明因而左思右想:我要不要上線的時候把打印語句註釋掉,測試的時候再打開呢?

可是想到要常常開關注釋也不是個容易的事兒,因而鹿小明一咬牙,996變007,廢寢忘食的更新出了 V2.0版本。他把日誌打印封裝成框架 logging-1.0.jar,能夠進行統一的開關。順利完成了這個工做。

故事進入 V3.0 環節

一段時間歲月靜好

one day,虎大力找到鹿小明:你這個日誌框架功能太簡單了 ,再搞點新功能,像輸出到文件啊,異步啊都搞上。

鹿小明因而左思右想,007以後繼續007,廢寢忘食的更新出了 V3.0 版本,封裝成一個新的框架logging-2.0.jar。順利完成了這個工做。

故事進入 V4.0 環節

一段時間歲月靜好

one day,虎大力找到鹿小明:1.0和2.0的api不同,1.0換成2.0,2.0換成1.0 每次切換都要改代碼,你改一下吧,改爲能夠想用哪一個用哪一個的。

鹿小明因而左思右想,007以後繼續007,這個需求有點難,他從JDBC上找到了靈感,JDBC經過統一接口實現了驅動的切換,日誌也能夠。

因而,他爆肝搞出來一個日誌接口層(日誌門面),讓 1.0 和 2.0的日誌框架都實現這個接口,這樣想用1.0的時候就導入1.0,想用2.0的時候就導入2.0 。順利完成了這個任務。

而這個設計的結構也是如今主流日誌框架:log4j logback log4j2 等的結構

日誌門面(接口) 日誌實現
SLF4J,commons-logging Logback,Log4j

經過它們就打印出了咱們常見的各類日誌信息

日誌框架結構分析

日誌框架實際上分爲三個部分,除了上面提到的日誌門面(接口)和日誌庫(實現),還有日誌適配器

日誌門面 接口規範

定義接口規範,不負責具體實現,也就是說之後代碼中打印日誌時調用的日誌門面接口的方法。常見的有 SLF4J,commons-logging 都是這樣。常見的日誌門面有下面幾種

日誌門面(接口規範層) 簡介
JCL(Jakarta Commons Logging) 這個jar就是常見的 commons-logging.jar,也是Spring框架中使用的日誌門面。因爲上一次更新仍是在2014年,因此不建議使用
SLF4j(Simple Logging Facade for Java) 這個jar能夠說是最經常使用的日誌jar包了
jboss-logging 使用最少,一些特定的框架在使用

根據簡單的分析,在咱們的代碼中若是要選擇一款 日誌的接口規範的話,毫無疑問,只有 SLF4j 配得上咱們的項目。

日誌庫 代碼實現

日誌庫是日誌功能的具體實現,早期就是爲了替代 System.out 語句而出現的。經常使用的日誌庫以下:

日誌庫(日誌實現) 簡介
log4j 最先誕生,用的也最多
logback 最晚出現,和log4j同一做者,是log4j的升級版
log-jdk jdk 在1.4版本出現的java.util.logging 簡稱 log-jdk

在實際的開發中,log4j和logback的使用都很是的普遍,可是若是你如今要開發的是一個新項目,那麼推薦使用 logback

日誌門面適配器 又名 接口實現轉換器

這個東西是啥呢?要從歷史提及,在日誌框架的歷史中,並非先有 日誌門面(接口規範),後有日誌庫。實際的狀況是 做者 先寫出來 log4j 用了一段時間以後纔有了 slf4j 。

Tips:

  1. slf4j log4j logback 是同一個爹(做者)
  2. log4j 能夠等價於 鹿小明寫的 1.0 那時候尚未接口規範

由於這個前後順序的問題,就出現了一個很尷尬的狀況,代碼實現和接口不兼容,由於log4j的代碼中沒有實現slf4j的接口,因此要使用 slf4j+log4j的話,須要有個中間層(日誌門面適配器)來解決接口的兼容問題。

舉個例子:你買的超極本上沒有網線插口怎麼辦呢?買個USB的轉換器,這個裝換器就是咱們說的中間層,也就是 日誌門面適配器。 slf4j+「轉換器」+log4j 才能正常工做。

經過這樣的設計模式,slf4j不只兼容了log4j,還兼容了不少其餘的日誌框架。經過閱讀slf4j官方文檔 能夠看到這樣一張圖

在圖中標記了 1 2 3 4,對照前面的概念解釋一下

標記1:這是隻有接口規範,沒有日誌實現的狀況,項目中只有接口沒有實現也就不會有任何日誌信息輸出。

標記2:應用代碼中使用logback做爲日誌庫實現,經過圖示能夠看到logback是直接實現SLF4J接口的,不須要「轉換器」。接口層+代碼實現。這也是logback和log4j的區別之一。

標記3:應用代碼中使用log4j做爲日誌庫實現,這個圖示在slf4j-api.jar以後,還有一個slf4j-log4j12.jar,他就是咱們提到過的「轉換器」日誌門面適配器。接口層+轉換器+代碼實現 的關係。

標記4:這個圖示中也有轉接頭jar包,只不過這個jar包是爲了兼容log-jdk。

那麼問題來了,logback和log4j在使用上有什麼區別?

日誌庫適配器 又名slf4j如何一統日誌江湖?

日誌門面適配器「接口實現轉接器」解決了接口規範和實現之間不兼容的問題。咱們終於能夠愉快的開始枯燥的日誌打印了。

可是慢着,難道沒有以爲哪裏不對嗎?你品,你細品

雖然咱們的項目採用slf4j在快樂的打印日誌,可是其餘的框架用的可不是slf4j,譬如Spring(commons-logging)、Hibernate(jboss-logging),這種狀況下 咱們的項目的就像一個國家有了不少套法律,到底聽誰的, 因此咱們須要讓別的框架和log4j一塊兒統一使用slf4j進行輸出日誌?

咋能作到呢?這就要用到日誌庫適配器了。它也是一個轉接頭,舉個栗子

slf4j 至關於只有type-c接口的蘋果電腦。如今你有不少U盤想接到電腦上,可是U盤用的是USB接口,要怎麼辦呢?

買一個 type-c 轉 USB的轉換器便可

經過官方文檔找到下面這張圖—說明了 其餘日誌框架如何接入到slf4j上

這張圖上有三個圖示,因爲三個的原理的都同樣,咱們以左上角的爲例作簡單的講解:

這張圖咱們先豎着看,就是應用程序使用的logback作日誌框架,接口規範+實現的簡單關係。

接着咱們橫着看,會看到 commons-logging log4j(以前說過log4j生的早)log-jdk,這些就是應用中其餘框架Spring等使用的日誌框架,想讓這些框架統一接入到slf4j, 怎麼辦呢?

以commons-logging爲例,若是你的項目中用了Spring,Spring就須要使用到commons-logging.jar ,怎麼讓 Spring 的日誌最終經過 slf4j 輸出呢?

1.咱們須要先排除 commons-logging.jar ,畢竟它壓根兒就沒有輸出到slf4j的功能,可是排除以後spring會報錯啊,不要慌 這就到了第二步。

2.用 jck-over-slf4j.jar 替換 commons-logging.jar, 這個包有什麼做用呢?偷天換日,鳩佔鵲巢,它就是咱們要找的轉換器,一方面它的功能和commons-logging同樣,徹底能夠替代;另外一方面,能夠無縫接入到slf4j。

這個中間轉換器包就是就是日誌庫適配器。

簡單吧,經過上述兩步就能夠實現 commons-logging 統一到slf4j 。

經過這樣的邏輯,能夠很簡單的把log4j,log-jdk 也都能經過中間的轉換包統一到slf4j,也就實現了slf4j一統日誌江湖。

總結

總結回顧好習慣

日誌框架分爲

1.日誌門面,定義了日誌的接口規範

2.日誌庫,實現日誌具體功能的代碼實現

3.日誌門面適配器,又名 接口實現轉換器

4.日誌庫適配器,又名 第三方接入slf4j轉接頭

注意

在使用 slf4j + 日誌庫 模式的時候,要防止日誌庫衝突,簡單說就是 要麼用 slf4j+log4j 要麼用 slf4j+logback 千萬不要兩個都用!!!

恭喜你完成了本文的閱讀,爲你鼓掌!

本文講解的內容是 日誌框架的基本認識,關於日誌框架在項目中的使用,以及開發中的日誌規範,請持續關注。

自測面試題

  • logback 和 log4j的區別

求關注,求點贊,求轉發

本人擁有兩年開發經驗和三年Java大數據教學經驗,曾幫助2000+學生成功就業和跳槽。

相關文章
相關標籤/搜索