使用Log4J捕获并记录所有未处理的异常

use*_*237 5 java log4j exception-handling

我有一个使用Log4J作为日志框架的中型Java Web应用程序.现在我正在通过我的异常处理和日志记录来使我的应用程序更加健壮.它运行在Tomcat 6上,spring,hibernate和Struts2作为框架.

我想要做的是记录应用程序中发生的每个UNHANDLED异常.所以我可以记录它们,让log4j给我发电子邮件,然后看看我在哪里缺少try-catch块.最后相应地修改我的代码.

因为现在所有未处理的异常都直接打印到屏幕上,我的用户通常不会复制我的异常.

我知道我可以阅读tomcat-logs,但我想让它们由log4j处理,以便我可以收到有关每个此类异常的电子邮件.

有什么建议?

Phi*_*art 5

使用Struts2,您可以为特定类型定义全局异常映射Exception.如果为java.lang.Exception定义一个,它将作为未映射到其他地方的任何异常的catch-all:

<global-exception-mappings>
  <exception-mapping exception="com.example.MyException result="myError" />
  <exception-mapping exception="java.lang.Exception" result="error" />
</global-exception-mappings>

<global-results>
  <result name="myError">/myError.jsp</result>
  <result name="error">/error.jsp</result>
</global-results>
Run Code Online (Sandbox Code Playgroud)

在您的错误JSP(*)中,您可以使用log4j记录它们,并为您的用户提供一个不错的"出问题"错误页面,而不会让他们遇到混乱的堆栈跟踪.

(*)更好:一个错误操作,您可以在其中记录异常,然后让Struts呈现一个JSP,告诉用户出现问题.不需要使用日志代码来混淆JSP.

关于修改所有代码:

不要盲目地在代码中添加catch块 - 如果某段代码无法处理异常,只需让它传播(throws如果有必要,在方法签名上添加一个子句).在堆栈的某些级别,考虑包装抛出的Exception并添加一些信息以帮助确定原因并重新抛出它:

 catch (IllegalArgumentException ex) {
    // Always pass the original exception along, never just the message.
    // It's much easier to find the root cause that way.
    throw new UpdateException("Failed to parse foo object: " + foo, ex);
 }
Run Code Online (Sandbox Code Playgroud)

此外,抵制emtpy catch块的诱惑.他们吞下了这个例外,你可能永远都不会发现你的应用程序中存在某些内容或可能出现的问题.记录所有异常,除非您非常确定您永远不会对它们感兴趣.