SLF4J 的几种实际应用模式--之三:JCL-Over-SLF4J+SLF4J(2010年04月07日) 发表于 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 包。 执行上面的代码,看到输出: [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 > 《日志管理》