首页 > 解决方案 > TurboFilter 用于限制记录的异常 - 不起作用

问题描述

我使用 logback 的 TurboFilter 创建了一个 TurboFilter 来限制异常。

这是代码:

package com.example;
import java.util.concurrent.ConcurrentHashMap;
import org.slf4j.Marker;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.turbo.TurboFilter;
import ch.qos.logback.core.spi.FilterReply;

public class ExceptionFilter extends TurboFilter {

    private ConcurrentHashMap<String, Long> exceptionCache = new ConcurrentHashMap<>();
    private long suppressTimeInMS = 10 * 60 * 1000;

    @Override
    public void start() {
        super.start();
    }

    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {

        FilterReply reply = FilterReply.NEUTRAL;
        long currTime = System.currentTimeMillis();

        if (null != t) {
            String exceptionName = t.getClass().getName();
            if (!exceptionCache.containsKey(exceptionName)) {
                exceptionCache.put(exceptionName, currTime);
                reply = FilterReply.NEUTRAL;
            }
        else {
            long previousTime = exceptionCache.get(exceptionName);
            if ((currTime - previousTime) >= suppressTimeInMS) {
                exceptionCache.put(exceptionName, currTime);
                reply = FilterReply.NEUTRAL;
            }
            else {
                reply = FilterReply.DENY;
            }
        }
    }

    return reply;
    }

    public void setSuppressTimeInMS(long suppressTimeInMS) {
        this.suppressTimeInMS = suppressTimeInMS;
    }
}

在此我创建了一个ConcurrentHashMapException作为键和timestamp值存储的。我没有使用任何Cache.

逻辑是,suppressTimeInMS它会阻塞一段时间(通过回复 DENY),一旦结束,它就会允许记录。

但是,它没有按我的预期工作。

因此,如果此实现中存在一些问题,我正在寻找一些输入?

标签: javafilterlogback

解决方案


推荐阅读