SLF4J 的幾種實際應用模式--之三:JCL-Over-SLF4J+SLF4J(2010年04月07日) 發(fā)表于 Java博客我們前面已經講過了 SLF4J 的兩種用法:SLF4J+Log4J 和 SLF4J+Logback,那是在比較理想的情況下,所用組件只使用了 SLF4J 這一種統一日志框架的時候。可是 JCL 一直影響深遠,SLF4J 漸入佳境的時個,在你的項目中很可能所用的組件,它們分別用了 JCL 和 SLF4J 兩種組件。比如說在項目中用了 Hibernate 3.5 和 Struts,或其他 Apache 的一些開源組件,你大約也不想用了 SLF4J 的組件日志信息輸出到 A 處,用了 JCL 的組件日志輸出到 B 處,那你自己寫的代碼中的日志信息該往哪兒寫呢? <configuration> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="GBK"> <pattern>[Consociate] %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
<root level="DEBUG"> <appender-ref ref="stdout" /> </root> </configuration> 為了看看效果,我們在輸入的 pattern 中加入了 [Consociate],來檢驗是否統一到單一的日志通道中去了。使用 了 JCL 和 SLF4J 的代碼 package com.unmi; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestJCLOverSlf4j { //SLF4J 的 Logger private static final Logger logger = LoggerFactory.getLogger("From SLF4J");
//JCL 的 Log private static final Log log = LogFactory.getLog("From JCL"); //分別用上面的 logger 和 log 輸出日志,從輸出可以看到它們統一到一個通道中了 public static void main(String[] args) { logger.info("Hello {}","From SLF4J"); log.info("Hello From JCL"); } } 我們在上面代碼中,既使用了 JCL 統一日志框架,也使用了 SLF4J 的統一日志框架。要注意一點,從 JCL 橋接過來的 log 不能輸出參數化消息了。上面代碼使用了 org.apache.commons.logging.Log,import org.apache.commons.logging.LogFactory,但你卻用不著引入 commons-logging.jar 包。 執(zhí)行上面的代碼,看到輸出: [Consociate] 23:19:39.890 [main] INFO From SLF4J - Hello From SLF4J [Consociate] 23:19:39.921 [main] INFO From JCL - Hello From JCL 很明顯示 JCL 框架和 SLF4J 框架的日志輸出都統一到了一個通道中來了,為什么呢? SLF4J 使用的是 Logback 輸出的信息,這一點沒問題的,而 JCL 是不認識 Logback 的,所以 JCL 框架的輸出必然是繞道到 SLF4J,最后也是由 Logback 輸出的。 實現分析: 我們打開 jcl-over-slf4j-1.5.11.jar,看到里面有兩個包 org.apache.commons.logging 和 org.apache.commons.logging.impl,并有相應的類,這就是為什么,雖然在代碼中有: import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 卻不用把 commons-logging.jar 包引入到類路徑上的原因。 再深入下 jcl-over-slf4j-1.5.11.jar,看到其中還有個文件 /META-INF/services/org.apache.commons.logging.LogFactory,內容為: org.apache.commons.logging.impl.SLF4JLogFactory # Axis gets at JCL through its own mechanism as defined by Commons Discovery, which |
|
來自: CevenCheng > 《日志管理》