防止Java在某些异常上打印堆栈跟踪

时间:2012-02-10 16:43:57

标签: java exception logging

我有一个安全类,它会对未被授权进行某项操作的用户抛出AccessDeniedException。我做得很整齐,并在那里放了一个带有我需要的信息的消息。

问题是现在我的日志每次抛出时都会堆满堆栈跟踪。我不关心看到这个异常的堆栈跟踪,并且堆栈跟踪正在膨胀我的日志。

有没有办法告诉Java不要将堆栈跟踪打印到日志中,如果这是异常?

谢谢!

-

llappall

4 个答案:

答案 0 :(得分:4)

  

问题是现在我的日志充满了堆栈跟踪

这就像是说“我的火警不断发声,我怎么能让它更安静?”。只有两个很好的行动方案。

  • 确定这些是错误警报,并更改您的警报系统,使其对实际上并非危险的事件不那么敏感。抛出异常并不表示存在错误,即使是非常显着的错误,如果它是一个检查过的异常。即使已检查的异常值得记录,堆栈跟踪也不值得记录,因为堆栈跟踪仅对调试有用。

  • 确定警报是真实的,在这种情况下,找出为什么火灾不断爆发并修复点燃它们的任何东西。也就是说,修复导致异常抛出的错误。如果您有许多漏洞淹没您的日志文件,那么首先修复哪个无关紧要,所以只需修复日志文件中最容易阅读的文件

答案 1 :(得分:2)

我不知道这是否会对您的日志记录有所帮助,但是如果您创建一个Exception纯粹是为了提高代码的逻辑性和可读性,并且如果您从未想过要知道它来自何处,那么覆盖fillInStackTrace()方法,如下所示:

public class AccessDeniedException  extends Exception  {
    public synchronized Throwable fillInStackTrace()  { return this; }
}

这将提高你的程序的性能 - 如果你扔了很多它们会大大提高。它不会消除日志记录。其他答案应该有帮助,但如果他们不这样做, 的日志消息将会大大减少。

答案 2 :(得分:0)

您需要调查捕获(如果捕获)此异常的位置,并确保不记录异常,而只记录消息...

答案 3 :(得分:0)

您可以决定捕获该特定异常并且不对其做任何事情。 您可以在当前UncaughtExceptionHandler上设置Thread

Thread.currentThread().setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

并在句柄中对异常执行instanceof以查看是否是特定异常