升级Kafka和ZooKeeper镜像中Log4j版本时遇SLF4J实例化失败
解决Kafka/ZooKeeper不升级基础版本下升级Log4j 1.x到2.x的问题
错误原因
你遇到的java.lang.NoClassDefFoundError: org/apache/log4j/Level和SLF4J实例化失败,核心原因是:
- Kafka和ZooKeeper的代码及依赖库仍在调用Log4j 1.x的API(包名
org.apache.log4j),但你直接替换成了Log4j 2.x的核心包(API包名是org.apache.logging.log4j),导致找不到旧API的类。 - 原环境使用
slf4j-log4j12.jar作为SLF4J到Log4j 1.x的绑定,删除Log4j 1.x后,SLF4J找不到有效的日志实现,引发初始化失败。
解决方案步骤
需要添加Log4j 1.x到2.x的桥接包,并替换SLF4J的绑定包,同时保留原代码对Log4j 1.x API的兼容性。
1. ZooKeeper镜像修改的Docker指令
# 删除旧的Log4j 1.x jar和SLF4J-Log4j1.x绑定包 RUN rm /zookeeper-3.5.9/lib/log4j-1.2.17.jar \ && rm /zookeeper-3.5.9/lib/slf4j-log4j12-*.jar # 下载Log4j 2.x核心包、API包、1.x桥接包,以及SLF4J到Log4j 2的绑定包 RUN wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.0/log4j-core-2.17.0.jar -P /zookeeper-3.5.9/lib/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.0/log4j-api-2.17.0.jar -P /zookeeper-3.5.9/lib/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-1.2-api/2.17.0/log4j-1.2-api-2.17.0.jar -P /zookeeper-3.5.9/lib/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.0/log4j-slf4j-impl-2.17.0.jar -P /zookeeper-3.5.9/lib/
2. Kafka镜像修改的Docker指令
# 删除旧的Log4j 1.x jar和SLF4J-Log4j1.x绑定包 RUN rm /opt/kafka_2.12-2.2.1/libs/log4j-1.2.17.jar \ && rm /opt/kafka_2.12-2.2.1/libs/slf4j-log4j12-*.jar # 下载Log4j 2.x相关包 RUN wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.0/log4j-core-2.17.0.jar -P /opt/kafka_2.12-2.2.1/libs/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.0/log4j-api-2.17.0.jar -P /opt/kafka_2.12-2.2.1/libs/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-1.2-api/2.17.0/log4j-1.2-api-2.17.0.jar -P /opt/kafka_2.12-2.2.1/libs/ \ && wget https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.0/log4j-slf4j-impl-2.17.0.jar -P /opt/kafka_2.12-2.2.1/libs/
3. 日志配置文件适配
Log4j 2默认使用log4j2.xml/log4j2.properties,而原Kafka/ZooKeeper使用的是Log4j 1.x的log4j.properties,需要做以下适配:
- 方法一:将原
log4j.properties重命名为log4j2.properties,并在文件开头添加log4j1.compatibility=true开启兼容。 - 方法二:修改Kafka/ZooKeeper的启动脚本,添加JVM参数
-Dlog4j1.compatibility=true,让Log4j 2直接兼容旧配置文件。
关键包说明
log4j-1.2-api-2.17.0.jar:提供Log4j 1.x的所有API类(如org.apache.log4j.Level),内部将调用转发到Log4j 2的实现,解决类找不到的问题。log4j-slf4j-impl-2.17.0.jar:替换旧的slf4j-log4j12.jar,让SLF4J的日志请求由Log4j 2处理,解决SLF4J初始化失败问题。- 必须删除旧的
slf4j-log4j12.jar,否则会出现SLF4J绑定冲突,导致日志系统启动失败。
内容的提问来源于stack exchange,提问作者priya dhana
相关产品推荐
相关产品推荐

