1. 程式人生 > >SLF4J 的幾種實際應用模式--之一:SLF4J+Log4J

SLF4J 的幾種實際應用模式--之一:SLF4J+Log4J

SLF4J(Simple Logging Facade for Java) 是一個通用的日誌框架,不能何以謂之 Facade(門面),所扮眼的角色相當於 Jakarta Commons Logging。就像 JCL 需要底層的日誌實現,如 Log4J、java.util.logging、Simple Logger 等來完成具體的資訊輸出,事實上基本總是 JCL+Log4J 那麼一個絕配。SLF4J 的原旨也是能支援多種下層日誌框架實現,但最好的日誌實現仍然是 Log4J,所以本篇講述 SLF4J 的第一種用法 SLF4J+Log4J。

需要的配置檔案和元件包,下面三個 jar 檔案和一個 properties 檔案都是要放在專案的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)

log4j.properties 以前該是怎麼寫,現在還是怎麼寫,比如一個最簡單的內容,只向控制檯輸出日誌資訊,如下:

1 2 3 4 log4j.rootLogger=DEBUG,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

使用 SLF4J  的程式碼:

01 02 03 04 05 06 07 08 09 10 11 12 package com.unmi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestSlf4j { private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.
class); public static void main(String[] args) { logger.info("Hello {}","SLF4J"); } }

執行它,控制檯輸出:

2010-04-07 17:14:51,390 [com.unmi.TestSlf4j]-[INFO] Hello SLF4J

把這種 SLF4J+Log4J 的使用模式與曾為霸主地位的 JCL+Log4J 的用法進行一下對比(請忽略掉包檔案中的版本號):

SLF4J+Log4j 組合 對比 JCL+Log4J 組合
slf4j-api-1.5.11.jar 相當,定義高層 API commons-logging-1.1.jar
slf4j-log4j12-1.5.11.jar 相當,左邊是用繫結包,右邊
是用配置檔案來指定日誌實現
commons-logging.properties,內容為:
org.apache.commons.logging.LogFactory=
org.apache.commons.logging.impl.LogFactoryImpl
或者
org.apache.commons.logging.Log=
org.apache.commons.logging.impl.Log4JLogger
log4j-1.2.15.jar 一樣 log4j-1.2.15.jar
log4j.properties 一樣,原來怎麼配置現在也是 log4j.properties
程式程式碼中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J");

左邊侵入的是 SLF4J API,右邊是被 JCL 的 API 汙染了

SLF4J 支援引數化,而 JCL 不能

程式程式碼中:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

Log log = LogFactory.getLog(TestJCL.class);

log.info("Hello JCL");

從上面的對比來看,SLF4j+Log4j 與 JCL+Log4J 的使用方式差不多,主要差異就在 SLF4J 用 jar 來告知用哪種日誌實現,而 JCL 是通過配置檔案來獲得該選擇哪個日誌實現。

為什麼會興起 SLF4J,看看我們原來哪一個框架中,大的如 SSH 三雄(Spring、Struts、Hibernate),還有 WAS 應用伺服器,小的就不計其數以前用的通用日誌框架都清一色的 Jakarta Commons Logging(JCL),日誌實現會選用 Log4j,為何現在 Hibernate、Tapesty、DbUnit、Jetty V6 等紛紛變節,都採用了 SLF4J 了呢?SLF4J 與 JCL 相比,定然是有其可表之處。而其中 SLF4J 受類載入器的影響較小,不易產生記憶體溢位的問題,效能得到了改善,更主要是順應了潮流的發展--可方便部署到 OSGI 環境中。