1. 程式人生 > >log4j不打日誌問題之解決方案(一)

log4j不打日誌問題之解決方案(一)

日誌是應用軟體中不可缺少的部分,Apache的開源專案log4j是一個功能強大的日誌元件,提供方便的日誌記錄。在使用log4j的時候,難免會遇到各種問題;下面介紹一下,使用log4j不列印日誌情況的排查。

今天在測試mybatis與ehcache整合的時候發現一個問題,與大家分享一下, 就是匯入的log4j的日誌失效了,雖然馬上找到問題了,但還是與大家分享下

首先,在使用log4j的時候,必須的jar包。

  • commons-logging-1.2.jar
  • log4j-1.2.17.jar
  • slf4j-log4j12-1.7.21.jar
  • slf4j-api-1.6.4.jar

如果發現沒有日誌的列印,首先看一下是否缺少jar包。

舉例: 
這裡寫圖片描述

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
  • 1
  • 2
  • 3

由於缺少jar包導致的(我的原因就是未匯入此jar包)

<dependency>
    <groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

下面介紹一下 slf4j-api、slf4j-log4j12以及log4j之間什麼關係?

幾乎在每個jar包裡都可以看到log4j的身影,在多個子工程構成專案中,slf4j相關的衝突時不時就跳出來讓你不爽,那麼slf4j-api、slf4j-log4j12還有log4j他們是什麼關係?我把自己瞭解的和大家簡單分享一下:

slf4j: Simple Logging Facade for Java,為java提供的簡單日誌Facade。Facade:門面,更底層一點說就是介面。他允許使用者以自己的喜好,在工程中通過slf4j接入不同的日誌系統。更直觀一點,slf4j是個資料線,一端嵌入程式,另一端連結日誌系統,從而實現將程式中的資訊匯入到日誌系統並記錄。 
因此,slf4j入口就是眾多介面的集合,他不負責具體的日誌實現,只在編譯時負責尋找合適的日誌系統進行繫結。具體有哪些介面,全部都定義在slf4j-api中。檢視slf4j-api原始碼就可以發現,裡面除了public final class LoggerFactory類之外,都是介面定義。因此,slf4j-api本質就是一個介面定義。

下圖比較清晰的描述了他們之間的關係: 
這裡寫圖片描述

slf4j-log4j12:連結slf4j-api和log4j中間的介面卡。它實現了slf4j-api中StaticLoggerBinder介面,從而使得在編譯時繫結的是slf4j-log4j12的getSingleton()方法 
log4j:這個是具體的日誌系統。通過slf4j-log4j12初始化Log4j,達到最終日誌的輸出。