java - 如何以编程方式从 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 容器中添加和删除它。
解决方案
我认为这在 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);
}
}
}
推荐阅读
- php - 如果 element 为 null,则不会使用关键字 array() 将其添加到数组中,如何?
- php - laravel中的xml站点地图错误类PageContext
- javascript - 自定义 Hubspot 表单错误消息(使用 react.js)
- java - 使用 jooq 插入区间数据
- spring-data-rest - Spring Data Rest:预期 4xx 时出现 500 错误
- tensorflow - Tensorflow 2 Metrics 使用 2 个 GPU 产生错误的结果
- c++ - 范围检查超出范围访问 - C++
- javascript - Chrome 地理定位传感器破坏 CORS
- html - Bootstrap 模态形式:行不在第一行之下
- c++ - QT C++中对全局变量的未定义引用