工作中的問題
項(xiàng)目中使用的
log4j2
, 引入了同事寫的依賴包,使用的是slf4j
搭配log4j
。測(cè)試時(shí)發(fā)現(xiàn),原本程序中的log正常出現(xiàn),但依賴包里的log完全沒有,于是稍微學(xué)習(xí)了一下 slf4j 的知識(shí)。
slf4j的綁定
slf4j
的好處一搜一大堆。總的來說,它是各種log工具的具體實(shí)現(xiàn)上面的一個(gè)抽象層。用抽象層的好處就是可以解耦合。
既然slf4j本身只是抽象層,它自己并不對(duì)log功能進(jìn)行實(shí)現(xiàn),這就意味著它必須和一個(gè)負(fù)責(zé)實(shí)現(xiàn)的log工具搭配使用。在我們的項(xiàng)目中使用的是log4j
。
和同組的同事溝通之后發(fā)現(xiàn),原來我們的主程序使用的log工具最近從log4j
升級(jí)到了log4j2
,設(shè)置文件也從log4j.properties
變成了log4j2.properties
。
檢查程序的啟動(dòng)log,又發(fā)現(xiàn)了如下WARNING:
SLF4J: Class path contains multiple SLF4J bindings.
log4j和log4j2同時(shí)出現(xiàn)在了程序的依賴中,顯然這就是問題所在了。
于是我打開IntelliJ的依賴圖生成工具,將原本包含在依賴包中的slf4j-log4j12
刪除掉。再加上對(duì)應(yīng)版本的slf4j
和log4j12
之間的binding依賴。問題順利解決。
在這個(gè)例子中我們也可以發(fā)現(xiàn)使用slf4j的好處。在主程序已經(jīng)升級(jí)到log4j2
的情況下,依賴包的代碼完全不需要進(jìn)行更改,只需要對(duì)maven的pom文件進(jìn)行修改,就可以順利使用主程序的log工具。如果依賴包中直接使用的是log4j
的實(shí)現(xiàn)的話,我們恐怕不得不在 同時(shí)在主程序中使用兩個(gè)log工具 和 對(duì)依賴包的代碼進(jìn)行修改 之間選擇其一了。