日志對(duì)于一個(gè)系統(tǒng)的重要性不言而喻荐绝,幾乎所有的系統(tǒng)都會(huì)使用日志低匙,本文簡(jiǎn)單介紹一下當(dāng)前流行的日志框架
1.日志體系
日志體系大致如上圖所示旷痕,我們的系統(tǒng)會(huì)直接與接口層交互。當(dāng)然也可以直接使用具體的日志實(shí)現(xiàn)顽冶,比如logback欺抗,但是按照面向接口編程的理念,建議不要在系統(tǒng)中直接使用具體日志系統(tǒng)的代碼强重,否則后續(xù)若要更換日志系統(tǒng)绞呈,會(huì)相當(dāng)麻煩。
2.bridge層
先盜slf4j官網(wǎng)一張圖其中Adaptation layer是bridge層间景。為什么需要bridge报强?其實(shí)slf4j(slf4j-api.jar)只提供了一個(gè)門面,并沒有具體的實(shí)現(xiàn)拱燃。像最左邊的那一列,如果我們的系統(tǒng)中只引入了slf4j-api.jar力惯,那么日志無法輸出碗誉。若想正常輸出日志,還需引入真正寫日志到文件的jar包父晶。
圖中深藍(lán)色的日志框架并不需要bridge層就可以使用slf4j進(jìn)行日志打印哮缺,原因在于這些日志框架都直接實(shí)現(xiàn)了slf4j。而log4j和jdk log并沒有實(shí)現(xiàn)slf4j(廢話甲喝,jdk的log怎么可能依賴于第三方的框架尝苇。。。)糠溜,因此需要一個(gè)中間層去轉(zhuǎn)化一下淳玩。
總結(jié)一下,充當(dāng)bridge層的jar包:slf4j-log412.jar 和 slf4j-jdk14.jar
3.其他框架轉(zhuǎn)接到slf4j
也是先盜圖一張假設(shè)系統(tǒng)中使用了jcl作為了門面非竿,那么對(duì)jcl api的調(diào)用如何轉(zhuǎn)化為對(duì)slf4j api的調(diào)用蜕着?(常見的Spring框架的日志框架就是jcl)
slf4j提供了jar包將別的日志api的調(diào)用轉(zhuǎn)調(diào)到slf4j的api上。
jcl-over-slf4j.jar : jcl >>> slf4j
log4j-over-slf4j.jar : log4j >>> slf4j
jul-to-slf4j.jar : jdk api >>> slf4j
前兩個(gè)包需要分別替換commons-logging.jar和log4j.jar红柱。
在上述橋接承匣、轉(zhuǎn)換過程中,有一個(gè)限制就是轉(zhuǎn)調(diào)到slf4j的日志框架不能與當(dāng)前slf4j橋接的日志框架相同锤悄。舉個(gè)例子韧骗,系統(tǒng)使用slf4j和log4j打印日志,我們又引入了log4j-over-slf4j.jar去把log4j轉(zhuǎn)調(diào)到slf4j上零聚,這就會(huì)出現(xiàn)如下遞歸調(diào)用情況:
業(yè)務(wù)系統(tǒng) ---> slf4j api ---> log4j api --->轉(zhuǎn)調(diào)到 slf4j api ---> log4j api --->....
4.log4j2與slf4j
先區(qū)別幾個(gè)包
slf4j-log4j12.jar: slf4j提供的slf4j到log4j1.x的bridge袍暴;
log4j-over-slf4j.jar: slf4j提供的log4j轉(zhuǎn)調(diào)slf4j,一般是在業(yè)務(wù)系統(tǒng)直接調(diào)用了log4j的api握牧,但是想轉(zhuǎn)調(diào)到slf4j容诬,再通過別的日志框架進(jìn)行日志輸出的情況;
log4j-slf4j-impl.jar: log4j2提供的slf4j到log4j2.x的bridge沿腰;
5.總結(jié)
若業(yè)務(wù)系統(tǒng)中使用的是日志門面览徒,則參考concrete-bindings.png;
若業(yè)務(wù)系統(tǒng)沒有使用日志門面,但是想更換為別的具體日志系統(tǒng)颂龙,則參考legacy.png习蓬,先轉(zhuǎn)調(diào)到slf4j api,再通過別的日志系統(tǒng)輸出日志措嵌。
本文參考了
https://www.cnblogs.com/pekkle/p/6813458.html
https://www.slf4j.org/manual.html#swapping