概要
本文的目的是搞清楚Java中各種日志Log之間是怎么的關系,如何作用、依賴,好讓我們平時在作業中如果遇到“日志打不出”或者“日志jar包沖突”等之類的問題知道該如何入手解決,以及在各種場景下如何調整專案中的各個框架的日志輸出,使得輸出統一,
Log日志體系
在日常作業中我們可能看到專案中依賴的跟日志相關的jar包有很多,commons-logging.jar、log4j.jar、sl4j-api.jar、logback.jar等等,眼花繚亂,我們要正確的配置,使得jar包相互作用生效之前,就先要理清它們之間的關系,
背景/發展史
那就要從Java Log的發展歷程開始說起,
-
log4j(作者Ceki Gülcü)出來時就等到了廣泛的應用(注意這里是直接使用),是Java日志事實上的標準,并成為了Apache的專案 -
Apache要求把log4j并入到JDK,SUN拒絕,并在jdk1.4版本后增加了
JUL(java.util.logging) -
畢竟是JDK自帶的,JUL也有很多人用,同時還有其他日志組件,如SimpleLog等,這時如果有人想換成其他日志組件,如log4j換成JUL,因為api完全不同,就需要改動代碼,
-
Apache見此,開發了
JCL(Jakarta Commons Logging),即commons-logging-xx.jar,它只提供一套通用的日志介面api,并不提供日志的實作,很好的設計原則嘛,依賴抽象而非實作,這樣應用程式可以在運行時選擇自己想要的日志實作組件, -
這樣看上去也挺美好的,但是log4j的作者覺得JCL不好用,自己開發出
slf4j,它跟JCL類似,本身不替供日志具體實作,只對外提供介面或門面,目的就是為了替代JCL,同時,還開發出logback,一個比log4j擁有更高性能的組件,目的是為了替代log4j, -
Apache參考了logback,并做了一系列優化,推出了
log4j2
關系/依賴
大概了解心路歷程后,再詳細看看它們之間的關系、依賴,
JCL
commons-logging已經停止更新,最后的狀態如下所示:

JCL支持日志組件不多,不過也有很人用的,例如Spring 現在用的也越來越少了,也不多講了
SLF4J
因為當時Java的日志組件比較混亂繁雜,Ceki Gülcü推出slf4j后,也相應為行業中各個主流日志組件推出了slf4j的適配 圖來源于官方檔案
圖的意思為如果你想用slf4j作為日志門面的話,你如何去配合使用其他日志實作組件,這里說明一下(注意jar包名缺少了版本號,在找版本時也要注意版本之間是否兼容)
-
slf4j + logback
slf4j-api.jar+logback-classic.jar+logback-core.jar -
slf4j + log4j
slf4j-api.jar+slf4j-log4j12.jar+log4j.jar -
slf4j + jul
slf4j-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就好了,我又盜了一個圖來說明

適配思路
其實很簡單
-
你首先確認需要統一日志的模塊、框架是使用哪個日志組件的,然后再找到sfl4j的配接器,
-
記得去掉無用的日志實作組件,只保留你要用的,
常見問題
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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230879.html
標籤:Java
上一篇:SpringCloud入門
