「故事系列」小故事說清楚什么是日志框架


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

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

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

本文閱讀技術要求:見過日志

沒見也不要慌,如下圖,這就是日志,好了,你見過了。

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

日志的作用

  • 記錄系統中的操作
  • 記錄系統的運行狀況
  • 系統錯誤時候,根據日志分析原因

故事開始

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

故事進入 V1.0 環節

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

鹿小明一想,這好辦啊,本來自己為了調試測試方便就寫過很多打印語句,現在無非更多而已。於是就加班加點在所有的增刪改查方法中都寫了System.out.println()打印語句。順利完成了這個工作。

故事進入 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+學生成功就業和跳槽。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM