You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:04:55