2012-01-26 3 views
0

많은 기사/스레드를 읽었지만 아직 JSP에서 Apache Commons 로깅을 수행하는 가장 좋은 방법을 결정하지 못했습니다. JSP로 로그인하는 Apache Commons

나는 원래 그래서 지금 우리가 봄 봄이와 봄 3

을 사용 그래서보다는 사용하여 만든 컨트롤러가 봄 (2)를 사용하여 개발 된 응용 프로그램에 향상된 오류 로직을 추가하고, 일부 내용을 제공하기 위해 컨트롤러 수준에서 MVC 3의 예외 처리, 모든 컨트롤러에 대해 모든 Propogated 예외를 기록 할 JSP를 web.xml에 구성하는 것이 가장 좋을 것이라고 생각합니다.

놀랍게도 태그 라이브러리를 사용하여 JSP 내에서 로깅을 수행하는 쉬운 방법은 없습니다. Apache Commons는 로깅을 위해 은퇴 한 태그 라이브러리를 갖고있는 것처럼 보이지만, 이는 Apache Commons Logging 자체와는 달리 log4j를 기반으로합니다.

그래서 대신 내가 수행하고있어 내 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

JSP 파일에 원시 Java 코드를 넣는 것은 정말로 어색합니다.

로그 모두가 모든 컨트롤러

에 대한 예외를 propogated, 당신의 구체적인 기능 요구 사항에 관해서는 일반적인 관행은 /*에 매핑되는 것을위한 Filter을 사용하는 것입니다.

예.

@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