我们能比所有WARN行更具体地使用BurstFilter吗?

时间:2018-08-08 15:46:37

标签: logging log4j2

我们想使用BurstFilter设置,以在上游中断时限制质量记录。但是,我们担心的是,如果我们使用<BurstFilter level="WARN" rate="10" maxBurst="100"/>之类的内容,则会无意间过滤掉我们实际上想采取的行动而减少的垃圾邮件WARN行。

是否有一种方法可以应用与特定类(或类似类)的速率匹配的速率限制,以免浪费良好的日志?

我一直在思考:

  <Filters>
    <RegexFilter regex=".* our.custom.class.ServiceImpl .*" onMatch="ACCEPT" onMismatch="DENY"/>
    <BurstFilter level="WARN" rate="10" maxBurst="100"/>
  </Filters>

但是我很确定,它将忽略所有与我们的模式不匹配的内容,并限制执行的速度。

1 个答案:

答案 0 :(得分:1)

我不确定您如何配置记录器,但是您可以使用记录器的分层特性来按类或包过滤WARN级别的消息。

这是一个简单的例子来说明:

首先,配置文件:

!mkdir -p drive
!google-drive-ocamlfuse drive

现在是第一个Java类:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <BurstFilter level="WARN" rate="1" maxBurst="5" />
        </Console>
        <Console name="Console-NoFilter" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>


    </Appenders>

    <Loggers>
        <Root level="warn">
            <AppenderRef ref="Console-NoFilter" />
        </Root>
        <Logger name="example.OtherClass" level="info" additivity="false">
            <AppenderRef ref="Console-NoFilter" />
        </Logger>
        <Logger name="example.SomeClass" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
    </Loggers>
</Configuration>

这是第二个Java类:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SomeClass {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        for(int i=0; i<20; i++){
            log.warn("spam warning "+i);
        }

        OtherClass other = new OtherClass();
        other.doStuff();
    }
}

运行package example; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class OtherClass { private static final Logger log = LogManager.getLogger(); public void doStuff(){ for(int i=0; i<20; i++){ log.warn("not so spam warning "+i); } } } 时,它将在控制台中仅生成5条WARN消息,而SomeClass由于没有过滤器,因此将生成20条WARN消息。