liuxiaoshui
发布于 2023-12-10 / 12 阅读
0
0

日志切换演示

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。


评论