一. 整合核心包
1.1 門(mén)面
Slf4j 基本的日志門(mén)面馋吗,核心API:org.slf4j:slf4j-api
1.2 核心實(shí)現(xiàn)
logback的核心實(shí)現(xiàn)層在ch.qos.logback:logback-core中
1.3 適配
logback針對(duì)Slf4j的適配層 ch.qos.logback:logback-classic
logback-classic會(huì)直接依賴(lài)其他兩項(xiàng),且一定是依賴(lài)能夠支持的最合適版本抖仅,所以顯式依賴(lài)logback-classic即可。
二. 基于依賴(lài)兼容
2.1 Slf4j 與JDK
Slf4j 2.0.x有不小的改動(dòng)残腌,不再主動(dòng)查找org.slf4j.impl.StaticLoggerBinder叠艳,而是改用JDK ServiceLoader(也就是SPI,Service Provider Interface) 的方式來(lái)加載實(shí)現(xiàn)怯屉。這是JDK 8中的特性.
2.2. logback 與slf4j和JDK
2.3 小結(jié)
如果使用JDK 8蔚舀,建議選擇Slf4j 2.0 + Logback 1.3;
如果使用JDK 11及以上锨络,建議選擇Slf4j 2.0 + Logback 1.5
三. SpringBoot 兼容
Spring Boot通過(guò)spring-boot-starter-logging包直接依賴(lài)了Logback(然后再間接依賴(lài)了 Slf4j)赌躺,它通過(guò)org.springframework.boot.logging.LoggingSystem查找日志接口并自動(dòng)適配,所以我們使用Spring Boot時(shí)一般并不需要關(guān)心日志依賴(lài)羡儿,只管使用即可.
四. 橋接
實(shí)際項(xiàng)目中我們依賴(lài)的其他二方礼患,三方包中可能使用JCL/Log4j/Log4j2/JUL其他日志框架,為了使其能夠正常打印日志,舊需要做好橋接缅叠。
org.slf4j:jcl-over-slf4j
org.slf4j:log4j-over-slf4j
org.slf4j:jul-to-slf4j
org.apache.logging.log4j:log4j-to-slf4j log4j2 橋接到Slf4j
五. Maven排包
- 將要排掉的包通過(guò)引入一個(gè)占位的空包(版本號(hào)一般比較特殊咏瑟,比如999-not-exist),從而達(dá)到排包的目的痪署。但這種特殊版本的空包一般在Mvnrepository Central倉(cāng)庫(kù)是沒(méi)有的(各廠(chǎng)的私有倉(cāng)庫(kù)一般會(huì)有這種包)码泞,你可以自己搭建私有倉(cāng)庫(kù)并上傳這個(gè)版本,或者使用Version 99 Does Not Exist [16]也行狼犯。這是最完美的方案余寥,無(wú)論本地運(yùn)行還是遠(yuǎn)程編譯都不會(huì)有問(wèn)題。
- 將需要排掉的包使用<scope>provided</scope>標(biāo)識(shí)悯森,這樣這個(gè)包在編譯時(shí)會(huì)被跳過(guò)宋舷,從而達(dá)到排包的目的,但此包在本地運(yùn)行時(shí)仍會(huì)被引入瓢姻,導(dǎo)致本地運(yùn)行與遠(yuǎn)程機(jī)器環(huán)境差異祝蝠,不利于調(diào)試
- 使用maven-enforcer-plugin[17]插件標(biāo)識(shí)哪些包是要被排掉的,它只是一個(gè)校驗(yàn)幻碱,實(shí)際上你仍然需要在每個(gè)引入了錯(cuò)誤包的依賴(lài)中進(jìn)行排除