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

时间:2012-04-21 14:02:23

标签: java exception-handling log4j

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

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

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

使用Struts2,您可以为特定的Exception类型定义global exception mappings。如果为java.lang.Exception定义一个,它将作为未映射到其他地方的任何异常的全部捕获:

<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>

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

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

关于修改所有代码:

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

 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);
 }

此外,抵制emtpy catch块的诱惑。他们吞下了异常,你可能永远不会发现你的应用程序中出现了什么或可能出现的问题。记录所有例外情况,除非您非常确定自己永远不会对它们感兴趣。

答案 1 :(得分:0)

创建自定义错误页面,请参阅此处:How to show user-friendly error page in browser when runtime exception is thrown by servlet?

在错误页面中,您可以添加一些Java代码以使用log4j记录异常。

注意:将java代码放入JSP中通常被认为是不好的做法,但登录错误JSP是我认为可以接受的地方。