我们想使用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>
但是我很确定,它将忽略所有与我们的模式不匹配的内容,并限制执行的速度。
答案 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消息。