Java 以编程方式列出/修改log4j2的过滤器

Java 以编程方式列出/修改log4j2的过滤器,java,log4j2,Java,Log4j2,这是我的log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyAppx" packages=""> <Appenders> <RollingFile name="Application" fileName="/var/log/flex/flextask-websocket.log" filePattern="/var/log/f

这是我的
log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyAppx" packages="">
<Appenders>
    <RollingFile name="Application" fileName="/var/log/flex/flextask-websocket.log" filePattern="/var/log/flex/archive/flextask-websocket-%d{yyy-MM-dd}.log.gz">
        <Filters>
                <ThresholdFilter level="debug"  onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} websocket  %-10level %class{36} %L %M - %msg%xEx%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
    </RollingFile>
</Appenders>
<Loggers>
    <Root level="trace">
        <AppenderRef ref="Application" />
    </Root>
</Loggers>
根据xml文件的结构,我怀疑

loggerConfig.getAppenders().get("Application").getFilters()
但是
getFilters()
方法不可用

我只能这样做

loggerConfig.getFilter()
它返回一个过滤器。 但我如何才能访问所有过滤器?过滤器和附加器之间的关系在哪里

我的目标是在运行时只过滤特定的日志级别

所以当我说,例如,
setFilter(“Level1;Level2”)


我想删除
所有过滤器
,并且只对级别1和级别2进行过滤

从技术上讲,Log4j只支持单个过滤器。要允许多个筛选器,筛选器将是包含其他筛选器的CompositeFilter。如果您只有一个过滤器,只需指定没有过滤器元素的过滤器即可。

从技术上讲,Log4j只支持一个过滤器。要允许多个筛选器,筛选器将是包含其他筛选器的CompositeFilter。如果您只有一个筛选器,只需在没有筛选器元素的情况下指定它。

这有点难看,但是您实际上可以通过调用
getFilter()
并将返回的筛选器强制转换为
CompositeFilter
来列出appender的所有筛选器:

final LoggerContext context =
            (LoggerContext) LogManager.getContext(false);
final ConsoleAppender appender =
            context.getConfiguration().getAppender("Application");
final Filter rootFilter = appender.getFilter();

if (rootFilter instanceof CompositeFilter) {
    final CompositeFilter composite = (CompositeFilter)rootFilter;
    for (final Iterator<Filter> it = composite.iterator();
            it.hasNext(); ) {
        final Filter filter = it.next();
        // do something
    }
}
final LoggerContext上下文=
(LoggerContext)LogManager.getContext(false);
最终控制台暂停追加器=
getConfiguration().getAppender(“应用程序”);
final Filter rootFilter=appender.getFilter();
if(复合过滤器的根过滤器实例){
最终复合过滤器复合=(复合过滤器)根过滤器;
for(final Iterator it=composite.Iterator();
it.hasNext();){
最终过滤器=it.next();
//做点什么
}
}

这不是公共API的一部分,所以请谨慎使用,但它似乎有点难看,但实际上可以通过调用
getFilter()
并将返回的过滤器强制转换为
CompositeFilter
,列出appender的所有过滤器:

final LoggerContext context =
            (LoggerContext) LogManager.getContext(false);
final ConsoleAppender appender =
            context.getConfiguration().getAppender("Application");
final Filter rootFilter = appender.getFilter();

if (rootFilter instanceof CompositeFilter) {
    final CompositeFilter composite = (CompositeFilter)rootFilter;
    for (final Iterator<Filter> it = composite.iterator();
            it.hasNext(); ) {
        final Filter filter = it.next();
        // do something
    }
}
final LoggerContext上下文=
(LoggerContext)LogManager.getContext(false);
最终控制台暂停追加器=
getConfiguration().getAppender(“应用程序”);
final Filter rootFilter=appender.getFilter();
if(复合过滤器的根过滤器实例){
最终复合过滤器复合=(复合过滤器)根过滤器;
for(final Iterator it=composite.Iterator();
it.hasNext();){
最终过滤器=it.next();
//做点什么
}
}

这不是公共API的一部分,所以请谨慎使用,但似乎是这样。

您好,您找到解决方案了吗?我正在做一个类似的工作,我需要列出一个附录的过滤器。我,你找到解决方案了吗?我正在处理一个类似的任务,我需要列出一个appender的过滤器