在java web項目中SLF4J+LOG4J的配置



SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。

 看SLF4J的英文的F-facade(外表),就知道SLF4J只是一個只有“外表”的東西,也就是它沒有提供具體的實現類,只提供一個定義的接口。所以他需要與log4j這種已實現的日誌包一起使用。在程序的調用過程中,程序只會直接調用SLF4J的類實例,而不會出現log4j的實例。

總結上述:slf4j是一個日誌框架,log4j是一個日誌系統。

當然啦,也有人說爲什麼不直接用log4j還要再加一個slf4j呢?slf4j裏面有一個{},這個叫什麼呢?通配符。後面接的參數可以自動補入。例如:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

這段代碼後面的t與oldT就會根據參數順序依次補入到前面的{}中,可以減少程序因爲字符串拼接而造成堆內存的泄露。



相關的引用包有:

log4j-api:log4j對外提供的接口

log4j-core:log4j對api的具體實現,也叫核心包

log4j-web: 針對於java web的應用

slf4j-api:slf4對外提供的接口。slf4j它實質就是提供一個接口可以支持不同的日誌系統。所以它只有這個api沒有一般的core包

log4j-slf4j-impl:用於與slf4進行連接。

其中,有一個包與log4j-slf4j-impl非常相像,名字爲slf4j-log4j12的包,這兩個反編譯後發現還是有一些類的完全一致的,但是有一些又不同。所以我個人認爲這個有可能是因爲不同的需求封裝的不同API而已。

我在這裏使用log4j-slf4j-impl主要是爲了兼容。也沒有過多去深究。理由很簡單:log4j-slf4j-impl與slf4j-log4j1都放在maven依賴裏,看一下日誌文件哪個可以打出來就用哪個。

下面是maven裏的依賴(親測有效)

<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>2.9.1</version>
    </dependency>

在程序中編寫log4j2.xml文件,然後在web.xml裏配置

    <!--log4j2-->
    <context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>/WEB-INF/conf/log4j2.xml</param-value>
    </context-param>

在程序中引用:

Logger log = LoggerFactory.getLogger(controller.class);
log.debug("XXX")

就可以在log4j2.xml文件中指定的路徑下訪問到對應的日誌輸出。

遺留問題:

  • log4j各種層級結構是怎麼樣的?
  • slf4j各種層級結構的含義?



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章