hooyantsing's Blog

P25 SLF4J日志桥接器

字数统计: 621阅读时长: 2 min
2022/04/24

视频源:黑马程序员java日志框架教程,全面深入学习多种java日志框架

桥接旧的日志框架(Bridging)

针对老日志框架迁移至 SLF4J 及其实现

通常,您依赖的某些组件依赖于 SLF4J 以外的日志记录 API。您也可以假设这些组件在不久的将来不会切换到 SLF4J 。为了解决这种情况,SLF4J 附带了几个桥接模块,这些模块将对 log4j、JCL 和 java.util.logging API 的调用重定向,就好像它们是对 SLF4J API 一样。

桥接解决的是项目中日志的遗留问题,当系统中存在之前的日志 API,可以通过桥接转换到 SLF4J 的实现。

  1. 先去除之前老的日志框架的依赖;
  2. 添加 SLF4J 提供的桥接组件;
  3. 为项目添加 SLF4J 的具体实现。

image-20220424092802677

该图源自官方文档。

SLF4J 桥接 log4j

导入依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--slf4j 日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>

<!--logback 日志实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

<!--log4j 日志实现
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
-->

<!--log4j 桥接器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.apache.log4j.Logger;
import org.junit.Test;

public class Log4jTest {

// 定义 log4j 日志对象
public static final Logger LOGGER = Logger.getLogger(Log4jTest.class);

// 测试桥接器
@Test
public void test01(){
LOGGER.info("hello log4j");
}
}

注意,log4j 日志框架需要配置 log4j.properties 文件。

经过 SLF4J 桥接 log4j 后,输出由 log4j 日志样式转变为 logback 日志样式。

注意事项

  1. jcl-over-slf4j.jar 和 slf4-jcl.jar 不能同时出现。前一个 jar 文件将导致 JCL 将日志系统的选择委托给 SLF4J ,后一个 jar 文件将导致 SLF4J 将日志系统的选择委托给 JCL,从而导致 无限循环
  2. log4j-over-slf4j.jar 和 slf4j-log4j12.jar 不能同时出现;
  3. jul-to-slf4j.jar 和 slf4j-jdk-14.jar 不能同时出现;
  4. 所有的桥接都只对 Logger 日志记录器对象有效,如果程序中调用了内部的配置类或者是 Appender,Filter 等对象,将无法产生效果。
CATALOG
  1. 1. 桥接旧的日志框架(Bridging)
    1. 1.1. SLF4J 桥接 log4j
    2. 1.2. 注意事项