2014-09-29 82 views
1

我想为每个记录器的记录行配置速率限制(例如:每个记录器可以每分钟发送最多100条记录行)。Logback - 由记录器设置的阈值

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

你有什么想法吗?

+0

万一你这个解决了你自己,这将是真棒,如果你能发布自我回答,或至少一些评论与一些指针。谢谢! – Yonatan 2015-01-22 08:52:37

回答

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添加了此过滤器,以我的appender

<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>

+0

这很好,除了我认为你的意思是'expireAfterWrite'而不是'expireAfterAccess'。 – user1995521 2015-05-30 03:22:42

相关问题