javaee日志不同框架间切换

前言

现在在市面上有很多日志框架,有java原生api,也有陆陆续续很多种日志框架,导致在项目维护及开发过程中 日志api引用比较混乱。例如spring框架中使用了logback框架,里面使用的都是logback的日志api,而之前项目开发的依赖中使用的是log4j。自己现在开发过程中要是用log4j2框架,如果按照之前的方式需要配置散出日志输出配置,这样开发维护起来很不方便。
现在打算在一处进行日志配置,对日志进行集中管理,更改之前依赖源代码是不现实的。但是要配置多处日志配置管理起来也很费劲。针对这种问题,出现了两种框架JCL(Commons Logging) 以及slf4j。这两种框架都是日志的接口,供用户使用,而没有提供实现!
下面将以slf4j的使用,来达到不更改原来框架源代码的前提下,更改框架底层框架输出,达到日志的统一管理。

日志关系

在这里插入图片描述

一.不同日志框架转slf4j

说明:

现阶段使用的是其他的日志框架的api进行日志输出,但是现在将之前的日志依赖包排除,交给slf4j框架进行统一管理日志,需要进入的包。也就是将原来的日志框架转为slf4j,同时原来的代码不需要更改,只需将原来日志依赖排除即可。

1.使用log4j2 转为slf4j :log4j-to-slf4j

maven地址

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.11.0</version>
</dependency> 

2 logback转为slf4j:logback-classic

maven地址

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.0</version>
</dependency>

3 jul转为slf4j:jul-to-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

4 log4j转为slf4j:log4j-over-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.22</version>
</dependency>

5 commons-logging转为slf4j:jcl-over-slf4j

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.21</version>
    <type>pom</type>
</dependency>

二.slf4j依赖具体实现

说明:

使用slf4j日志接口框架输出日志,但是这仅仅是接口,并不能真正进行日志输出,因此需要通过桥梁来达到真正的日志输出,因此使用不同的日志框架输出需要不同的日志桥梁。要点就是使用slf4japi进行日志控制。

1.slf4j-jdk14:slf4j到jdk-logging的桥梁

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.21</version>
    <type>pom</type>
</dependency>

2.slf4j-log4j12:slf4j到log4j1的桥梁

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.24</version>
    <type>pom</type>
</dependency>

3.log4j-slf4j-impl:slf4j到log4j2的桥梁

maven地址 注意:是apache

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.8.1</version>
</dependency>

4.logback-classic:slf4j到logback的桥梁

maven地址

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.0</version>
</dependency>

5.slf4j-jcl:slf4j到commons-logging的桥梁

maven地址

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.25</version>
    <type>pom</type>
</dependency>

三. 使用场景

1.原来项目中使用log4j日志框架进行输出,现在要转为log4j2

再不改变原来代码前期下,需要操作

步骤一:将原来项目中关于log4j日志相关jar包进行排除

步骤二:如果原来项目中有日志配置,将日志配置删除

步骤三:导入log4j转为slf4j包,交由slf4j管理

 导入上面一中的 log4j转为slf4j:log4j-over-slf4j 包

步骤四:将slf4j具体实现类交由log4j2

导入上面二中的log4j-slf4j-impl:slf4j到log4j2的桥梁

步骤五:导入log4j2j所需要的jar包。


<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.5</version>
</dependency>

2. 其他框架也是采用类似1.

如果需要进行切换,将之前日志框架输出交给slf4j,然后由slf4j在指定具体日志框架即可。
如果使用slf4j语言,一定要导入具体实现的日志jar包,通过不同的桥梁来达到使用slf4j的api操作日志输出的作用,还是那句话,slf4j只是接口。桥梁的作用就是将slf4j的接口进行实现,不同的桥梁调用不同的日志jar包。当然配置文件也需要根据所选日志框架而定。

四.框架冲突

  1. jcl-over-slf4j 与 slf4j-jcl 冲突
    jcl-over-slf4j: commons-logging切换到slf4j
    slf4j-jcl : slf4j切换到commons-logging
    如果这两者共存的话,必然造成相互委托,造成内存溢出
  2. log4j-over-slf4j 与 slf4j-log4j12 冲突
  3. jul-to-slf4j 与 slf4j-jdk14 冲突
  4. log4j-to-slf4j与slf4j-log4j12冲突

猜你喜欢

转载自blog.csdn.net/qq_32281025/article/details/83900040
今日推荐