目录

一、核心组成部分

1. 日志门面

2. 日志实现

3. 替换器/绑定器/适配器(SLF4J API → 具体实现)

4. 桥接器(具体实现 → SLF4J)

二、SLF4J集成架构

三、日志框架实战

1. 替换器使用场景

1.1 不需要替换器的场景

1.2 需要替换器的场景

2. 桥接器使用场景


一、核心组成部分

1. 日志门面

概念

提供统一的日志API接口,让你的应用代码与具体的日志实现解耦

主要jar包

  • slf4j-api-{version}.jar - SLF4J日志门面

  • commons-logging-{version}.jar - JCL (Jakarta Commons Logging) 日志门面

  • log4j-api-{version}.jar - Log4j2的API门面部分


2. 日志实现

概念

日志的具体实现。

主要jar包

  • logback-classic-{version}.jar - Logback实现 (原生支持SLF4J)

  • logback-core-{version}.jar - Logback核心

  • log4j-core-{version}.jar - Log4j2核心实现

  • log4j-{version}.jar - Log4j1.x实现

  • JUL (java.util.logging) - JDK自带,无需额外jar


3. 替换器/绑定器/适配器SLF4J API → 具体实现

概念

将日志门面连接到具体的日志实现

工作原理

日志门面调用 → 适配器 → 具体日志实现

主要jar包

  • log4j-slf4j-impl-{version}.jar - 将SLF4J适配到Log4j2

  • slf4j-log4j12-{version}.jar - 将SLF4J适配到Log4j1.x

  • slf4j-jdk14-{version}.jar - 将SLF4J适配到JUL

  • logback-classic-{version}.jar - 本身就包含SLF4J到Logback的适配器


4. 桥接器(具体实现 → SLF4J)

概念

用于将旧的日志框架桥接到新的日志门面

工作原理

旧日志API调用 → 桥接器 → 目标日志门面 → 具体实现

主要jar包

  • jcl-over-slf4j-{version}.jar - 将JCL调用路由到SLF4J

  • log4j-over-slf4j-{version}.jar - 将Log4j1.x API调用路由到SLF4J

  • jul-to-slf4j-{version}.jar - 将JUL调用路由到SLF4J


二、SLF4J集成架构

三、日志框架实战

1. 替换器使用场景

1.1 不需要替换器的场景

场景一:SLF4J + Logback

logback-classic 本身就包含了SLF4J的绑定实现,所以不需要绑定器)

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
</dependencies>

1.2 需要替换器的场景

场景一:SLF4J + Log4j 1.x

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <!-- 需要额外的绑定器 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.36</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

场景2:SLF4J + Log4j2

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <!-- 需要Log4j2的SLF4J绑定器 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.1</version>
    </dependency>
</dependencies>

2. 桥接器使用场景

场景1:Spring 3.x项目迁移到SLF4J+Logback

背景:Spring 3.x默认使用Commons Logging,但现在想统一用Logback。

解决方案:使用jcl-over-slf4j.jar桥接Commons Logging到SLF4J

<dependencies>
    <!-- 移除原有的 commons-logging 依赖 -->
    
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    
    <!-- 桥接器:将Commons Logging桥接到SLF4J -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.36</version>
    </dependency>
    
    <!-- Logback实现 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.11</version>
    </dependency>
    
    <!-- Spring框架(会依赖Commons Logging,但被桥接器拦截) -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.18.RELEASE</version>
    </dependency>
</dependencies>

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐