1.单纯使用 Commons Logging 记录日志
依赖
<dependencies>
<!-- Commons Logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
代码示例
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JCLDemo {
public static void main(String[] args) {
Log logger = LogFactory.getLog(JCLDemo.class);
logger.info("This is a Commons Logging statement.");
}
}
运行效果:
2. 桥接 Commons Logging 到 SLF4J
依赖
<dependencies>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<!-- SLF4J Commons Logging Bridge -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.32</version>
</dependency>
<!-- Commons Logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
<!--因为jcl-over-slf4j里会提供相同限定名的org.apache.commons.logging.Log类实现,故此处可以排除,否则classpath出现两套-->
<scope>provided</scope> <!-- Exclude Commons Logging at runtime -->
</dependency>
</dependencies>
代码示例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JCLDemo2 {
public static void main(String[] args) {
// Commons Logging logger
org.apache.commons.logging.Log jclLogger = org.apache.commons.logging.LogFactory.getLog(JCLDemo2.class);
jclLogger.info("This is a Commons Logging statement.");
// SLF4J logger (using JCL bridge)
Logger slf4jLogger = LoggerFactory.getLogger(JCLDemo2.class);
slf4jLogger.info("This is an SLF4J log statement using Commons Logging bridge.");
}
}
运行结果:
两行日志均未打印,因为没有导入具体的日志实现。
新增依赖
<!-- 具体的日志实现 Logback Classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version> <!-- 使用最新版本 -->
</dependency>
运行结果
此时,不论原来的使用jcl的api打印的日志,还是最新使用slf4j的api打印的日志均使用lockback实现输出。
贴出各个日志框架转换图
结论
该示例演示了为什么桥接器是jcl-over-slf4j,中间为什么是over。
"Over" 含义: 这个桥接模块被设计为覆盖或替代 Commons Logging(JCL)系统为 SLF4J。它允许使用 Commons Logging 的应用程序在不更改其日志调用的情况下无缝切换到 SLF4J。