[英]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.