如何以编程方式从log4j2中删除logger中的appender?

时间:2017-01-13 07:23:37

标签: logging log4j2

有没有办法可以通过编程方式从log4j2中的记录器中删除appender?

该网站称“Log4j 2 API不公开添加,修改或删除appender和过滤器或以任何方式操纵配置的方法”: https://logging.apache.org/log4j/2.x/manual/configuration.html

但如果有人能提出间接的方法来实现这一点,我真的很感激。

感谢。

4 个答案:

答案 0 :(得分:4)

有一个方法LoggerConfig#removeAppender(String name)将删除特定的appender和LoggerConfig#clearAppenders(),它将删除所有的appender。假设你有一个名为CONSOLE的追加者:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
config.getRootLogger().removeAppender("CONSOLE");
ctx.updateLoggers();

答案 1 :(得分:0)

开发idea of Anton(在log4j 2.11.1上):

LoggerContext context = LoggerContext.getContext(false);
Configuration configuration = context.getConfiguration();
LoggerConfig loggerConfig = configuration.getLoggerConfig("loggerName");
if (loggerConfig.getName().equals("loggerName")) {
    loggerConfig.removeAppender("appenderName")
} else {
    throw new RuntimeException("There was no logger " + "loggerName");
}
context.updateLoggers();

答案 2 :(得分:0)

LoggerContext loggerContext = (LoggerContext) LogManager.getContext(true);
Configuration configuration = loggerContext.getConfiguration();
LoggerConfig loggerConfig = configuration.getLoggerConfig(_logger.getName());
loggerConfig.getAppenders().forEach((key, value) -> loggerConfig.removeAppender(value.getName()));

答案 3 :(得分:-1)

你可以删除Appender吗?是。你应该?几乎总是答案是否定的。如果LoggerConfig,AsyncAppender或RoutingAppender引用Appender怎么办?你会收到一个错误。

在大多数情况下,您确实希望使用更智能的过滤功能。它们正是为了减少或消除路由到Appender的事件数量。