5

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

我想做的是记录应用程序中发生的每一个未处理的异常。这样我就可以记录它们,让 log4j 给我发一封电子邮件,然后看看我在哪里错过了 try-catch 块。最后相应地修改我的代码。

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

我知道我可以阅读 tomcat 日志,但我想让它们由 log4j 处理,这样我就可以收到关于每个此类异常的电子邮件。

有什么建议么?

4

2 回答 2

5

使用 Struts2,您可以为特定类型定义全局异常映射。Exception如果您为 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 记录它们并为您的用户提供一个很好的“出现问题”错误页面,而不会让他们面对令人困惑的堆栈跟踪。

(*) 更好:一个错误操作,您可以在其中记录异常,然后才让 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);
 }

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

于 2012-04-21T14:28:49.587 回答
0

创建自定义错误页面,请参见此处:当 servlet 抛出运行时异常时,如何在浏览器中显示用户友好的错误页面?

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

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

于 2012-04-21T14:28:05.357 回答