繁体   English   中英

如何以编程方式从 Log4j2 配置/任何其他 Log4j2 容器中删除 Appender?

[英]How to programmatically remove an Appender from Log4j2 configuration/ Any other Log4j2 container?

在 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 容器中添加和删除它。

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

但是,这可以通过@rgoers所说的AbstractConfiguration来完成。

[编辑]可以利用AbstractConfiguration class 实现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);
        }
    }
}

实际上,Rohit Gaikwad 的回答只是部分正确。 虽然 Configuration 接口不提供 removeAppender 方法,但 AbstractConfiguration - 所有 Log4j2 提供的 Configurations 扩展的 class - 确实提供了一个。 此方法将从任何引用它的 LoggerConfigs 中删除 Appender,将其从 Configuration 中删除,然后停止 Appender。

虽然 removeAppender 是同步的,保证了数据结构不会被破坏,但它并不能保证你不会有问题。 删除 appender 时将继续记录,这意味着在删除 appender 时可以将事件路由到 appender,并且当 appender 处于停止的 state 时,正在处理的事件可能会尝试处理,这将导致记录这些事件失败。 这是它不属于接口的主要原因 - 让您知道 Log4j 团队认为这是我们主要在测试中使用的内部方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM