Java日誌體系權威總結

概要

本文的目的是搞清楚Java中各類日誌Log之間是怎麼的關係,如何做用、依賴,好讓咱們平時在工做中若是遇到「日誌打不出」或者「日誌jar包衝突」等之類的問題知道該如何入手解決,以及在各類場景下如何調整項目中的各個框架的日誌輸出,使得輸出統一。java

Log日誌體系

在平常工做中咱們可能看到項目中依賴的跟日誌相關的jar包有不少,commons-logging.jarlog4j.jarsl4j-api.jarlogback.jar等等,眼花繚亂。咱們要正確的配置,使得jar包相互做用生效以前,就先要理清它們之間的關係。程序員

背景/發展史

那就要從Java Log的發展歷程開始提及。面試

  1. log4j(做者Ceki Gülcü)出來時就等到了普遍的應用(注意這裏是直接使用),是Java日誌事實上的標準,併成爲了Apache的項目設計模式

  2. Apache要求把log4j併入到JDK,SUN拒絕,並在jdk1.4版本後增長了JULjava.util.loggingapi

  3. 畢竟是JDK自帶的,JUL也有不少人用。同時還有其餘日誌組件,如SimpleLog等。這時若是有人想換成其餘日誌組件,如log4j換成JUL,由於api徹底不一樣,就須要改動代碼。網絡

  4. Apache見此,開發了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日誌接口api,並不提供日誌的實現。很好的設計原則嘛,依賴抽象而非實現。這樣應用程序能夠在運行時選擇本身想要的日誌實現組件。多線程

  5. 這樣看上去也挺美好的,可是log4j的做者以爲JCL很差用,本身開發出slf4j,它跟JCL相似,自己不替供日誌具體實現,只對外提供接口或門面。目的就是爲了替代JCL。同時,還開發出logback,一個比log4j擁有更高性能的組件,目的是爲了替代log4j。架構

  6. Apache參考了logback,並作了一系列優化,推出了log4j2框架

關係/依賴

大概瞭解心路歷程後,再詳細看看它們之間的關係、依賴。編輯器

JCL

commons-logging已經中止更新,最後的狀態以下所示:

 

 

JCL支持日誌組件很少,不過也有很人用的,例如Spring 如今用的也愈來愈少了,也很少講了

SLF4J

由於當時Java的日誌組件比較混亂繁雜,Ceki Gülcü推出slf4j後,也相應爲行業中各個主流日誌組件推出了slf4j的適配 圖來源於官方文檔

圖的意思爲若是你想用slf4j做爲日誌門面的話,你如何去配合使用其餘日誌實現組件,這裏說明一下(注意jar包名缺乏了版本號,在找版本時也要注意版本之間是否兼容)

  • slf4j + logbackslf4j-api.jar + logback-classic.jar + logback-core.jar

  • slf4j + log4jslf4j-api.jar + slf4j-log4j12.jar + log4j.jar

  • slf4j + julslf4j-api.jar + slf4j-jdk14.jar

  • 也能夠只用slf4j無日誌實現slf4j-api.jar + slf4j-nop.jar

SLF4J的適配

slf4j支持各類適配,不管你如今是用哪一種日誌組件,你均可以經過slf4j的適配器來使用上slf4j。只要你切換到了slf4j,那麼再經過slf4j用上實現組件,即上面說的。圖來源於官方文檔

 

 

 

其實總的來講,不管就是如下幾種狀況

  • 你在用JCL 使用jcl-over-slf4j.jar適配

  • 你在用log4j 使用log4j-over-slf4j.jar適配

  • 你在用JUL 使用jul-to-slf4j.jar適配

我在網上盜一張圖,給你們一個總體的依賴圖(懶得畫了)

 

 

 

讓Spring統一輸出

這就是爲了對slf4j的適配作一個例子說明。Spring是用JCL做爲日誌門面的,那咱們的應用是slf4j + logback,怎麼讓Spring也用到logback做爲日誌輸出呢?這樣的好處就是咱們能夠統一項目內的其餘模塊、框架的日誌輸出(日誌格式,日誌文件,存放路徑等,以及其餘slf4j支持的功能) 很簡單,就是加入jcl-over-slf4j.jar就行了。我又盜了一個圖來講明

 

 

適配思路

其實很簡單

  1. 你首先確認須要統一日誌的模塊、框架是使用哪一個日誌組件的,而後再找到sfl4j的適配器。

  2. 記得去掉無用的日誌實現組件,只保留你要用的。

常見問題

slf4j的日誌加載會在程序啓動時把日誌打出來,因此必定要注意,它會說明加載是否成功,加載了那個日誌實現。slf4j已經對錯誤做了說明官網說明下面講一下可能常常遇到的問題

Failed to load class org.slf4j.impl.StaticLoggerBinder

沒找到日誌實現,若是你以爲你已經寫上了對應的日誌實現依賴了,那你要檢查一下了,通常來講極有多是版本不兼容。

Multiple bindings

找到多個日誌實現,slf4j會找其中一個做爲日誌實現。

代碼規範

阿里對此的代碼規範:

【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架 SLF4J 中的 API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class);

總結

文章幫你們梳理了Java日誌組件的關係,以及如何解決平常中常見日誌相關的問題,但願對你們幫助。

小編總結了2020面試題,這份面試題的包含的模塊分爲19個模塊,分別是: Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。 

關注公衆號:程序員白楠楠

參考資料

架構師必備,帶你弄清混亂的JAVA日誌體系!10分鐘搞定–混亂的 Java 日誌體系Java主流日誌工具介紹和使用https://www.slf4j.org/

相關文章
相關標籤/搜索