我遇到的情况是,过于频繁地抛出同样的异常并且会泛滥日志/控制台。 代码逻辑就像:
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");
}
答案 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 log4j的TriggeringEventEvaluator。你在用log4j吗?
答案 2 :(得分:0)
是。您可以通过声明在“catch”块中递增的全局变量来限制抛出异常的次数,以及在变量的值足够大时终止程序的条件。
答案 3 :(得分:0)
您可以使用一个静态volatile变量(可以跨线程访问)计算catch块输入的次数,然后使用%
运算符来确定它是否是例如它的倍数。 10。