如何抑制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
相关产品推荐
相关产品推荐

