仅在第n次发生时记录异常

时间:2014-02-20 19:05:57

标签: java exception

我遇到的情况是,过于频繁地抛出同样的异常并且会泛滥日志/控制台。 代码逻辑就像:

public void run(){
    ....
    try {
    } catch (Throwable trace) {
        LOG.error("catch throwable" , trace);   
    }  
}

有没有办法可以更改'catch'块,以便它只记录第n次?

catch (Throwable trace) {
    if ( the 100th time)
        LOG.error("catch throwable" , trace);   
    else 
        LOG.error("catch throwable"); 
}  

4 个答案:

答案 0 :(得分:3)

注意:

例外情况非常昂贵。

您不应该将它们用于控制流,而应该添加检查(使用if语句,例如:if(AAA==null))以避免出现异常。

<强>代码:

下面会照顾它。每次出现异常时,您都会有一个递增计数器。你取这个模N,当结果为零时,你记录错误。

private int exceptionCounter = 1;
private static int N = 100;

public void run(){
    ....
    try {
    } catch (Throwable trace) {
        if(exceptionCounter++ % N == 0)
            LOG.error("catch throwable:" + String.valueOf(exceptionCounter ) + " Exceptions thrown." , trace);   
    }  
}

更新

如果您在共享的多线程ExceptionCounter之后需要使用原子变量。

private static AtomicInteger exceptionCounter = new AtomicInteger();

    private static int N = 100;

    public void run(){
        ....
        try {
        } catch (Throwable trace) {
            if(exceptionCounter.incrementAndGet() % N == 0)
                LOG.error("catch throwable:" + String.valueOf(exceptionCounter ) + " Exceptions thrown." , trace);   
        }  
    }

答案 1 :(得分:1)

如果您认为可能需要此功能,那么大多数日志记录框架都提供了拦截日志尝试的方法。通过扩展框架,您可以决定是否记录某些内容。您甚至可以在短时间内完成所有日志并延迟所有日志记录,如果在该时间段内重复相同的日志,则只需将其与之前的日志合并,以及计数器。

我在谷歌发现的第一个例子就是这个使用email throttler for log4jTriggeringEventEvaluator。你在用log4j吗?

答案 2 :(得分:0)

是。您可以通过声明在“catch”块中递增的全局变量来限制抛出异常的次数,以及在变量的值足够大时终止程序的条件。

答案 3 :(得分:0)

您可以使用一个静态volatile变量(可以跨线程访问)计算catch块输入的次数,然后使用%运算符来确定它是否是例如它的倍数。 10。

但是,我会建议您考虑记录到文件。一个好的日志文件在程序完成后需要解决问题时是非常宝贵的。