0

我已经阅读了许多关于此的不同文章/线程,但尚未确定在我的 JSP 中执行 Apache Commons 日志记录的最佳方式。

为了提供一些上下文,我将改进的错误逻辑添加到最初使用 Spring 2 开发的应用程序中。所以现在我们有了使用 Spring 2 和 Spring 3 创建的控制器。

因此,与其在控制器级别使用 Spring MVC 3 的异常处理,我认为最好在 web.xml 中配置一个 JSP,该 JSP 将记录所有控制器的所有传播异常。

令人惊讶的是,我没有看到使用标记库在 JSP 中执行日志记录的简单方法。Apache Commons 似乎有一个已退役的日志标签库,但这是基于 log4j 而不是 Apache Commons Logging 本身。

因此,我在我的 JSP 中以编程方式执行以下操作:

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
<%@ page isErrorPage="true" %>
<% Log logger = LogFactory.getLog(this.getClass()); %>
<html>
<head>
</head>
<body>
    <% 
        StringBuilder stringBuilder = new StringBuilder("\n" + exception); 
        for(StackTraceElement element : exception.getStackTrace())
        {
            stringBuilder.append("\n" + element.toString());
        }
        logger.error("Unhandled exception caught: " + stringBuilder.toString()); 
    %>
    <p>Text here</p>
</body>
</html>

所以我的问题是......有没有更好的方法来执行这个日志记录?上述工作,但似乎不必要的尴尬应该是一个常见的任务

4

1 回答 1

1

将原始 Java 代码放在 JSP 文件中确实很尴尬。至于您的具体功能要求,

记录所有控制器的所有传播异常

通常的做法是将 aFilter用于映射到 的内容/*

例如

@WebFilter("/*")
public class ExceptionFilter implements Filter {

    private Log logger = LogFactory.getLog(getClass());

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (ServletException e) {
            logger.error("Unhandled exception caught", e);
            throw e;
        }
    }

    // ...
}

请注意,您不需要自己构建堆栈跟踪。如果您将异常作为第二个参数传递,记录器已经这样做了。即便如此,您也可以使用其他Throwable#printStackTrace(PrintWriter)方法。

于 2012-01-26T18:24:40.643 回答