如何以编程方式更改ThresholdFilter的日志级别?

时间:2016-07-01 11:45:20

标签: logging log4j2

今天我需要以编程方式更改特定appender的日志级别。用户应该能够通过休息界面或用户输入对话框设置级别。我玩这些课程以获得appender和过滤器,但这不符合我的期望。筛选器列表已空。以下是我配置的简短摘录:

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" name="forum" monitorInterval="30">
  <properties>
    <property name="logging.statement.pattern">%d{DATE} %-5p %-20.20t %m [|] %l [|] %x [|] %t%n</property>
  </properties>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    </Console>
    <RollingFile name="FileLogAppender" fileName="${sys:logging.target.dir}/dicom.log" filePattern="${sys:logging.target.dir}/output-%i.log">
      <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
      <PatternLayout>
        <Pattern>${logging.statement.pattern}</Pattern>
      </PatternLayout>
      <Policies>
        <SizeBasedTriggeringPolicy size="10MB" />
      </Policies>
      <DefaultRolloverStrategy max="10" />
    </RollingFile>
  </Appenders>

  <Loggers>
    <Logger name="third.party.package" level="INFO" additivity="false">
      <AppenderRef ref="FileLogAppender" />
    </Logger>
    <Logger name="my.custom.package.internal" level="TRACE" additivity="false">
      <AppenderRef ref="FileLogAppender" />
    </Logger>
    <Logger name="my.standard.package" level="DEBUG" additivity="false">
      <AppenderRef ref="FileLogAppender" />
    </Logger>

    <Root level="INFO">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

我使用 LogManager 类来获取配置,然后我首先考虑获取appender名称指定的appender。但是appender没有提供过滤器列表,所以我不能迭代它们来获取 ThresholdFilter 并设置级别。另一种尝试是直接从配置中获取过滤器列表。但这个清单似乎每次都是空的。任何人都可以给我一个提示,寻找正确的方法来设定水平吗?

先谢谢,哈迪

2 个答案:

答案 0 :(得分:2)

Appender只有一个过滤器。你可以通过在Appender上调用getFilter方法来获得它。该过滤器可能是CompositeFilter,在这种情况下,它是其他过滤器的容器,您必须遍历它们才能找到所需的过滤器。在上面的配置中,您只能使用一个过滤器。

但是,ThresholdFilter中的级别是不可变的,因此没有setLevel方法。您需要编写过滤器的自定义版本才能执行此操作或创建Jira问题以修改Log4j。

答案 1 :(得分:1)

如果您想编写自定义过滤器,最好的办法是扩展AbstractFilter