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