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

时间:2015-10-20 09:31:38

标签: 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/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>

现在我想以编程方式修改过滤器

到目前为止,我的代码是

LoggerContext ctx = (LoggerContext)     LogManager.getContext(false);           
Configuration config = ctx.getConfiguration();
LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);

根据我怀疑要做的xml文件的结构

loggerConfig.getAppenders().get("Application").getFilters()

getFilters()方法不可用

我只能做

loggerConfig.getFilter()

返回单个过滤器。 但是,我如何才能访问所有过滤器? filter和appender之间的关系在哪里?

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

所以当我说例如。 setFilter("Level1;Level2")

我想删除allFilters并仅过滤Level1和Level2

2 个答案:

答案 0 :(得分:0)

技术上Log4j仅支持单个过滤器。要允许多个过滤器,过滤器将是包含其他过滤器的CompositeFilter。如果您只有一个过滤器,则只需指定不带过滤器元素的过滤器。

答案 1 :(得分:0)

这有点难看,但是您实际上可以通过调用final并将返回的过滤器强制转换为getFilter()来列出附加程序的所有过滤器:

CompositeFilter

这不是公共API的一部分,因此请谨慎使用,但似乎Log4j2 actually does that internally