Logback - 通过记录器设置阈值

时间:2014-09-29 09:21:27

标签: filter logback appender

我想为每个记录器配置日志行的速率限制(例如:每个记录器每分钟最多可以发送100个日志行)。

我有想法,我是否应该使用一个新的简单过滤器(我不认为TurboFilter是合适的)?还是一个新的追加者? 过滤声音更合适,但其他过滤器可以覆盖我的决定,这就是为什么我认为用appender实现它。

你有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我已经编写了自己的过滤器。它看起来像这样:

public class ThresholdFilter extends Filter<ILoggingEvent> {
private final Cache<String/*Logger*/, AtomicInteger> loggerRates = CacheBuilder.newBuilder()
        .expireAfterWrite(1, TimeUnit.MINUTES).build();

@Override
public FilterReply decide(ILoggingEvent event) {
    return (isStarted() && (getLimit(event.getLoggerName()) > 100)) ? FilterReply.DENY : FilterReply.NEUTRAL;
}

private int getLimit(String loggerName) {
    int i = 0;
    try {
        i = loggerRates.get(loggerName, () -> new AtomicInteger(0)).incrementAndGet();

    } catch (ExecutionException ignored) {
    }
    return i;
}  }

然后将此过滤器添加到logback.xml中的appenders

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="org.ahiel.ThresholdFilter"> <encoder><pattern>[%thread] %-5level %logger{35} - %msg %n</pattern></encoder> </appender>