首页 > 解决方案 > 如何以编程方式从 Log4j2 配置/任何其他 Log4j2 容器中删除 Appender?

问题描述

在 Log4j2.x 中,可以将 Appender 添加到 Logger 配置中,如下所示:

Appender appender =//get an appender
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.getConfiguration().addAppender(appender);

现在,如何从配置中删除这个附加程序?我在配置中找不到删除方法。

在 Log4j1.x 中,可以从 AppenderAttachable 中删除一个附加程序,如下所示:

AppenderAttachable appenderContainer = //get appenderContainer 
String appenderName = // get appenderName 
appenderContainer.removeAppender( appenderName );

在这里,我不想将 Appender 添加到 Logger。只需从配置或任何其他 Log4j2 容器中添加和删除它。

标签: javalog4jlog4j2

解决方案


我认为这在 Log4j2.x 中是不可能的,因为除了从 Logger/LoggerConfig 中删除 appender 之外,没有其他方法。 removeAppender

但是,这可以通过@rgoersAbstractConfiguration所说的方式完成。

[编辑]可以使用如下AbstractConfiguration实现的类Configuration

import org.apache.logging.log4j.core.config.AbstractConfiguration; 

private static LoggerContext ctx = (LoggerContext) LogManager.getContext(false);

/**
 * Remove an appender from configuration.
 * @param appenderName
 */
public static void removeAppender(String appenderName) {
    appenderName = //Trim the String;
    if (appenderName == null)
        throw new NullPointerException("CUSTOM_ERROR_MESSAGE");

    AbstractConfiguration config = (AbstractConfiguration) ctx.getConfiguration();
    config.removeAppender(appenderName);
}

/**
 * Remove all AsyncAppenders from configuration for a given AsyncAppender.
 * @param asyncAppender
 */
public static void removeAllAppenders(final AsyncAppender asyncAppender) {
    final String appenderNames[] = asyncAppender.getAppenderRefStrings();
    if (null != appenderNames) {
        for (String appenderName : appenderNames) {
            removeAppender(appenderName);
        }
    }
}

推荐阅读