log 日誌原理

ck_2016發表於2024-06-30

1)slf4j介面

僅僅定義了介面,因此,需要繫結到具體的日誌框架才可以列印日誌出來,具體如何來做呢,引用一張slf4j官網上的圖片:

具體的組合使用:

slf4j-api,日誌是打到了/dev/null裡面,因此啥也列印不出來
slf4j-api + logback-classic:使用的是logback,因為logback本身直接實現了slf4j的api
slf4j-api + slf4j-log4j + log4j:最終是使用log4j,因為log4j本身並沒有實現slf4j的介面,所以中間用slf4j-log4j橋接了一下子。
slf4j-api + slf4j-jdk + jul:最終是使用jul,中間用slf4j-jdk橋接了一下。
slf4j-api + slf4j-simple:slf4j的一個簡單實現,只能把日誌列印到System.err中。
slf4j-api + slf4j-nop:跟只用slf4j-api一樣,啥也不列印輸出。
slf4j-api + slf4j-jcl + jcl: 最終是使用jcl。

2)重定向
很多時候,我們的專案依賴了某一個jar,依賴包裡面可能並沒有使用slf4j列印日誌,而是使用的log4j或者jcl列印日誌,而我們的專案本身又想用slf4j,能不能把依賴包裡面的日誌列印重定向成我們的slf4j呢?,slf4j對這種情況也做了處理,在不修改依賴包裡面的程式碼的情況下可以這樣:
把jcl的jar包刪掉,換上jcl-over-slf4j;log4j的jar刪掉,換成log4j-over-slf4j;新增上jul-to-slf4j;然後再新增上slf4j-api 和 logback就可以在不修改打日誌的程式碼的情況下,最終都使用logback列印日誌。
把jcl的jar包刪掉,換上jcl-over-slf4j;新增上jul-to-slf4j;然後再新增上slf4j-api 和slf4j-log4j 和 log4j,最終就是使用log4j列印日誌。
把jcl的jar包刪掉,換上jcl-over-slf4j;log4j的jar刪掉,換成log4j-over-slf4j;然後再新增上slf4j-api 和 slf4j-jdk + jul,最終就是使用jul列印日誌。
以上也可以看出來,jcl-over-slf4j.jar和slf4j-jcl.jar不能共存的,log4j-over-slf4j.jar和slf4j-log4j12不能共存,jul-to-slf4j和slf4j-jdk14.jar不能共存。

3)組合實現示例

SLF4J + Log4j2實現

轉自:SpringBoot-04 | spring-boot-starter-logging原理原理-CSDN部落格

相關文章