JAVA 日志体系(一文读懂Java日志体系)
目录
3. 替换器/绑定器/适配器(SLF4J API → 具体实现)
一、核心组成部分
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>
更多推荐



所有评论(0)