【发布时间】:2014-01-06 21:44:34
【问题描述】:
我的 web.xml 中有以下行,它们用自定义的用户友好错误页面替换堆栈跟踪呈现。
<error-page>
<location>/error.html</location>
</error-page>
我想知道的是,是否可以让 Tomcat 将 error-page 元素处理的任何异常记录到日志文件中。如果我使用访问日志,我会看到 500,但我无法看到堆栈跟踪。如何将堆栈跟踪记录到日志中?
【问题讨论】:
我的 web.xml 中有以下行,它们用自定义的用户友好错误页面替换堆栈跟踪呈现。
<error-page>
<location>/error.html</location>
</error-page>
我想知道的是,是否可以让 Tomcat 将 error-page 元素处理的任何异常记录到日志文件中。如果我使用访问日志,我会看到 500,但我无法看到堆栈跟踪。如何将堆栈跟踪记录到日志中?
【问题讨论】:
您可以创建一个专门的 servlet 来处理错误。
<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
然后在<error-page>的<location>中引用这个:
<error-page>
<location>/ErrorHandler</location>
</error-page>
然后实现ErrorHandler servlet,以便在转发到现有的用户友好错误页面之前记录原始异常。例如:
public class ErrorHandler extends HttpServlet {
private static final Log LOG = LogFactory.getLog(ErrorHandler.class);
public void doGet(HttpServletRequest req, HttpServletResponse resp) {
// Obtain the original exception
final Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception");
// Log the exception
log.error("Caught unhandled exception: " + e, e);
// Forward to the friendly error page
RequestDispatcher rd = req.getRequestDispatcher("error.html");
rd.forward(request, response);
...
}
}
【讨论】: