Log4j2调用setThreshold关闭指定Appender报错如何解决
问题根因
- 你混用了Log4j 1.x和Log4j 2.x的API:
setThreshold()是Log4j 1.x的AppenderSkeleton类的方法,Log4j 2.x的org.apache.logging.log4j.core.Appender接口没有这个方法 - 代码中还错误引入了
org.apache.log4j.Level,Log4j 2.x的级别类是org.apache.logging.log4j.Level
方案1:动态移除/添加Appender引用(推荐,逻辑简单)
如果你只是需要完全关闭指定Appender的输出,直接从RootLogger上移除对应Appender的引用即可,需要恢复时再加回来就行:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; private static Logger logger = LoggerFactory.getLogger(UserOptions.class); public void adjustAppenderStatus() { // 类加载器隔离场景(如Spring Boot、Web容器)建议传false获取当前应用的上下文 LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); Configuration configuration = loggerContext.getConfiguration(); LoggerConfig rootLoggerConfig = configuration.getRootLogger(); // 控制控制台输出 if (!getOptionsAdditionalLoggingIsToConsole()) { rootLoggerConfig.removeAppender("Console"); } else { // 需要恢复时添加引用,Level传null表示继承RootLogger的级别 rootLoggerConfig.addAppender(configuration.getAppender("Console"), null, null); } // 控制文件输出 if (!getOptionsAdditionalLoggingIsToFile()) { rootLoggerConfig.removeAppender("File"); } else { rootLoggerConfig.addAppender(configuration.getAppender("File"), null, null); } // 必须调用该方法让修改后的配置生效 loggerContext.updateLoggers(configuration); }
方案2:动态修改Appender的阈值过滤规则(适合需灵活调整输出级别的场景)
如果后续需要灵活调整Appender的输出级别,而不是仅完全关闭,可以给Appender添加ThresholdFilter动态修改阈值:
import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.appender.AbstractAppender; import org.apache.logging.log4j.core.filter.ThresholdFilter; import org.apache.logging.log4j.Level; // 调整Console Appender阈值为OFF,完全关闭输出 if (!getOptionsAdditionalLoggingIsToConsole()) { AbstractAppender consoleAppender = (AbstractAppender) configuration.getAppender("Console"); // 新建阈值过滤器,匹配级别等于及高于OFF的日志全部拒绝 ThresholdFilter offFilter = ThresholdFilter.createFilter(Level.OFF, Filter.Result.DENY, Filter.Result.ACCEPT); consoleAppender.addFilter(offFilter); } // 修改后要更新配置生效 loggerContext.updateLoggers(configuration);
注意事项
- 项目中建议排除Log4j 1.x的传递依赖,避免两类API混用冲突
- 所有配置修改完成后必须调用
loggerContext.updateLoggers(configuration)才能生效
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

