摘要
本文主要讲述slf4j, jcl, logback, log4j2, log4j冲突问题。
适用场景为同时使用thrift, elasticsearch-client, 老内部库等第三方库造成日志管理难度问题。
日志系统介绍
首先总结java提供的日志系统,它包括:
- jul 全称java-utils-logging, jdk自带的日志系统)
- jcl 全称 apache commons-logging, 是apache commons集合中一个部分
- log4j 全称log for java。
- slf4j 全称 Simple logging facade for Java
- logback 它是log4j改良版
- log4j2 它是log4j的2.x版本
不同的第三方库因为其开始开发的年代不同,使用了不同的日志系统。
从而导致,使用这些第三方库时,需要对他们进行管理,统一管理或者各自管理各自的。
案例说明
最近开发的一个项目,服务框架使用apache thrift, 使用到了elasticsearch-client和一个内部库。
thrift使用的日志系统是slf4j, elasticsearch-client使用的日志系统是log4j2, 内部库使用的日志系统时jcl,老服务中使用的是logback。
这时维护四份日志的配置文件增加了服务的维护成本,解决的方案是,对日志系统进行桥接,统一维护。
进过查找资料发现:
从slf4j桥接到其它库的组件包括:
- slf4j-jdk14:slf4j到jdk-logging的桥梁
- slf4j-log4j12:slf4j到log4j1的桥梁
- log4j-slf4j-impl:slf4j到log4j2的桥梁
- logback-classic:slf4j到logback的桥梁
- slf4j-jcl:slf4j到commons-logging的桥梁
从其它库桥接到slf4j库包括:
- jcl-over-slf4j
- log4j-over-slf4j
- jul-to-slf4j
从其它库桥接到log4j2的库包括:
- log4j-slf4j-impl 桥街skf4j到log4j2
- log4j-jcl 桥街jcl到log4j2
解决方案
从当前情况而言,从slf4j,jcl,logback桥接到log4j2的成本较低.
添加log4j-slf4j-impl库和log4j-jcl 库,取出logback库的依赖。
由于logback的配置文件与log4j2的配置文件相近,因此可以平滑迁移。
修改pom文件, 添加下面内容:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jul</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
</dependency>
修改elasticsearch-client依赖为:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</dependency>
修改thrift依赖为:
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
</dependency>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</dependency>
参考
logback->log4j2迁移
slf4j、jcl、jul、log4j1、log4j2、logback大总结
maven search for log4j2