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

如何抑制org.apache.zookeeper.ZooKeeper的Log4j控制台输出

ZooKeeper客户端冗余日志抑制方案

ZooKeeper客户端默认会输出大量INFO级别的环境信息和连接日志,你遇到的配置不生效问题,核心原因是ZooKeeper依赖的SLF4J日志门面与你的Log4j2实现没有正确绑定,以下是可行的解决步骤:


1. 调整Maven依赖,统一日志实现

ZooKeeper自带了SLF4J的默认日志绑定(如logback或log4j1.x),会覆盖你的Log4j2配置。需要在pom.xml中排除这些绑定,引入Log4j2的SLF4J适配器:

<dependencies>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.8.3</version>
        <!-- 排除ZooKeeper自带的日志绑定 -->
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </exclusion>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入Log4j2的SLF4J适配器 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.20.0</version>
    </dependency>
    <!-- Log4j2核心依赖 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.20.0</version>
    </dependency>
</dependencies>

2. 配置Log4j2抑制ZooKeeper日志

在src/main/resources下创建log4j2.xml(或log4j2.properties),将ZooKeeper相关包的日志级别设为WARN或ERROR,只保留关键日志:

log4j2.xml示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <!-- 抑制ZooKeeper主包的INFO日志 -->
        <Logger name="org.apache.zookeeper" level="WARN" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <!-- 抑制ZooKeeper工具类日志 -->
        <Logger name="org.apache.zookeeper.common" level="WARN" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <!-- 抑制连接相关日志 -->
        <Logger name="org.apache.zookeeper.ClientCnxn" level="WARN" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
        <!-- 根日志配置 -->
        <Root level="INFO">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

log4j2.properties示例

status = warn
name = PropertiesConfig

appenders = console
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n

# 配置ZooKeeper相关日志级别
logger.zk.name = org.apache.zookeeper
logger.zk.level = warn
logger.zk.additivity = false
logger.zk.appenderRefs = stdout
logger.zk.appenderRef.stdout.ref = STDOUT

logger.zkCommon.name = org.apache.zookeeper.common
logger.zkCommon.level = warn
logger.zkCommon.additivity = false
logger.zkCommon.appenderRefs = stdout
logger.zkCommon.appenderRef.stdout.ref = STDOUT

logger.zkClient.name = org.apache.zookeeper.ClientCnxn
logger.zkClient.level = warn
logger.zkClient.additivity = false
logger.zkClient.appenderRefs = stdout
logger.zkClient.appenderRef.stdout.ref = STDOUT

# 根日志
rootLogger.level = info
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT

3. 确保配置文件被正确打包

检查Maven配置,确保src/main/resources下的配置文件被包含在Jar包中(默认会自动包含,若有自定义配置需确认):

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
    <!-- 其他插件配置保持不变 -->
</build>

4. 备选方案:代码动态调整日志级别

如果配置文件仍不生效,可以在创建ZooKeeper实例前,通过Log4j2 API动态设置日志级别:

package org.my;

import java.io.IOException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;

public class Test {
    public static void main(String[] argv) throws IOException {
        // 获取Log4j2上下文并调整日志级别
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration config = ctx.getConfiguration();

        // 设置ZooKeeper相关包的日志级别为WARN
        setLoggerLevel(config, "org.apache.zookeeper", org.apache.logging.log4j.Level.WARN);
        setLoggerLevel(config, "org.apache.zookeeper.common", org.apache.logging.log4j.Level.WARN);
        setLoggerLevel(config, "org.apache.zookeeper.ClientCnxn", org.apache.logging.log4j.Level.WARN);

        ctx.updateLoggers(config);
        
        System.out.println("hello");
        ZooKeeper zk = new ZooKeeper("localhost:8084", 100, null);
    }

    private static void setLoggerLevel(Configuration config, String loggerName, org.apache.logging.log4j.Level level) {
        LoggerConfig loggerConfig = config.getLoggerConfig(loggerName);
        loggerConfig.setLevel(level);
        config.addLogger(loggerName, loggerConfig);
    }
}

验证

重新构建并运行:

mvn clean install
java -jar target/MyApp-1.0.jar

此时只会输出你的hello信息,以及ZooKeeper的WARN及以上级别日志(若有)。

内容的提问来源于stack exchange,提问作者terrywb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:07:04