如何通过适配器将log4j2日志路由至log4j实现?
解决方案:把Log4j2 API的日志转接到现有Log4j 1.x实现
刚好遇到过类似的场景——你需要的是一套日志桥接组件,把依赖Log4j2 API的那些库的日志调用,转发到系统已经存在的Log4j 1.x实现上。虽然没有官方的"log4j2-to-log4j1"直接适配器,但用SLF4J当中间层是最稳妥的方案,具体步骤如下:
1. 先排除第三方库中的Log4j2原生实现
首先得确保你插件依赖的所有用Log4j2的库,都把log4j-core给排除掉——毕竟你不需要Log4j2自己的日志实现,留着它反而会和系统里的Log4j 1.x冲突。
如果用Maven的话,在依赖里加排除规则就行:
<dependency> <groupId>你的第三方库groupId</groupId> <artifactId>你的第三方库artifactId</artifactId> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> </exclusions> </dependency>
2. 引入Log4j2到SLF4J的桥接器
添加log4j-to-slf4j依赖,它的作用就和你提到的log4j-to-slf4j(针对Log4j1的适配器)类似,专门负责把Log4j2 API的日志调用转发到SLF4J框架:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.x.x</version> <!-- 版本要和第三方库用的Log4j2 API版本匹配 --> </dependency>
3. 引入SLF4J到Log4j 1.x的绑定器
最后加个slf4j-log4j12依赖,它会把SLF4J接收到的日志,再转发到系统已经有的Log4j 1.x实现上:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.x.x</version> <!-- 选个和Log4j 1.x兼容的SLF4J版本 --> </dependency>
几个关键注意点
- 版本一定要匹配:
log4j-to-slf4j的版本必须和第三方库用的Log4j2 API版本一致,不然容易出现API不兼容的问题。 - 检查依赖树:用
mvn dependency:tree(Maven)或者类似命令查一下最终依赖,确保没有同时存在log4j-core和Log4j 1.x的实现,不然日志可能乱输出或者报类加载异常。 - 不用改现有配置:因为最终日志会走系统原来的Log4j 1.x实现,所以原来的日志配置(比如输出目标、日志级别这些)完全不用动,直接生效。
要是你实在不想通过SLF4J中转,目前官方没有现成的直接桥接适配器,但可以基于Log4j2的LoggerContext接口自己写个简单的桥接器——不过这种方式需要自己维护代码,远不如SLF4J的方案稳定省心。
内容的提问来源于stack exchange,提问作者Daniel C. Sobral
相关产品推荐
相关产品推荐

