Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filter Logback-通过记录器设置阈值_Filter_Logback_Appender - Fatal编程技术网

Filter Logback-通过记录器设置阈值

Filter Logback-通过记录器设置阈值,filter,logback,appender,Filter,Logback,Appender,我想为每个记录器的日志行配置速率限制(例如:每个记录器每分钟最多可以发送100条日志行) 我有个想法,我应该用一个新的简单过滤器(我不认为涡轮过滤器是合适的)吗?还是一个新的附加器? 过滤器听起来更合适,但其他过滤器可以覆盖我的决定,这就是为什么我想用appender实现它 你有什么想法吗?我已经编写了自己的过滤器。看起来是这样的: public class ThresholdFilter extends Filter<ILoggingEvent> { private final C

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

我有个想法,我应该用一个新的简单过滤器(我不认为涡轮过滤器是合适的)吗?还是一个新的附加器? 过滤器听起来更合适,但其他过滤器可以覆盖我的决定,这就是为什么我想用appender实现它


你有什么想法吗?

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

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;
}  }
公共类阈值过滤器扩展过滤器{
private final Cache loggerRates=CacheBuilder.newBuilder()
.expireAfterWrite(1,TimeUnit.MINUTES).build();
@凌驾
公共筛选器独立决定(ILOGINGEVENT事件){
return(isStarted()&&(getLimit(event.getLoggerName())>100))?FilterReply.DENY:FilterReply.NEUTRAL;
}
private int getLimit(字符串loggerName){
int i=0;
试一试{
i=loggerRates.get(loggerName,()->new AtomicInteger(0)).incrementAndGet();
}捕获(ExecutionException被忽略){
}
返回i;
}  }
然后将此筛选器添加到logback.xml中的我的appender中


[%thread]-5级别%logger{35}-%msg%n

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

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;
}  }
公共类阈值过滤器扩展过滤器{
private final Cache loggerRates=CacheBuilder.newBuilder()
.expireAfterWrite(1,TimeUnit.MINUTES).build();
@凌驾
公共筛选器独立决定(ILOGINGEVENT事件){
return(isStarted()&&(getLimit(event.getLoggerName())>100))?FilterReply.DENY:FilterReply.NEUTRAL;
}
private int getLimit(字符串loggerName){
int i=0;
试一试{
i=loggerRates.get(loggerName,()->new AtomicInteger(0)).incrementAndGet();
}捕获(ExecutionException被忽略){
}
返回i;
}  }
然后将此筛选器添加到logback.xml中的我的appender中


[%thread]-5级别%logger{35}-%msg%n

万一你自己解决了这个问题,如果你能发布一个自我回答,或者至少是一条带有提示的评论,那就太棒了。谢谢万一你自己解决了这个问题,如果你能发布一个自我回答,或者至少是一个带有一些提示的评论,那就太棒了。谢谢这很好,除了我认为你的意思是
expireAfterWrite
而不是
expireAfterAccess
。这很好,除了我认为你的意思是
expireAfterWrite
而不是
expireAfterAccess