2012-01-26 127 views
0

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

提供一些背景下,我加入了改进的错误逻辑来使用Spring 2。所以,现在我们有一个被使用Spring 2和Spring 3

因此,而不是使用Spring创建的控制器,最初开发的应用程序MVC 3在控制器级别的异常处理,我认为最好在web.xml中配置一个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> 

所以我的问题是这样的....有没有执行此记录更好的办法?上述的工作,但似乎不必要的尴尬,什么应该是一个共同的任务

回答

1

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

日志都将会传播例外所有控制器

常见的做法是使用为这是对/*映射一个Filter

E.g.

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

+0

从来没有想过的过滤器,绝对看起来更整洁。当我尝试logger.error(“未处理的异常被捕获:”+异常)它只是打印NullPointerException ....也许我犯了一些错误。对于printStackTrace()我不想将它打印到屏幕上,只需记录它,我将如何工作? – DJ180

+0

可能是Commons Logger的配置问题。对不起,因为我从来没有用过它,所以不能详细说明。 – BalusC