에러에 대해서 급하게 정리 해봄
web.xml에 http error와 web container error에 대해서 다음과 같이 기술하고
<!-- errorPage 설정 -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/view/error/http/exception.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/view/error/http/404.jsp</location>
</error-page>
spring mvc 설정에 다음과 같이 exception 발생 시 exception.jsp파일이 호출되게 한 후
<!-- Exception 처리 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">/error/exception/exception</prop>
</props>
</property>
</bean>
해당 jsp 파일에 다음의 내용을 추가해서 로그를 찍으면 좀더 유지보수에 좋지 않을지...
<%@ page import="org.apache.log4j.Logger" %>
<%
Logger logger = Logger.getLogger("spring exception");
// client의 cookie나 request Uri 정보등등을 로그에 남기기
String newLine = System.getProperty("line.separator");
StringBuffer sb = new StringBuffer()
.append("requestURL[").append(request.getRequestURL()).append("]").append(newLine)
.append("pathInfo[").append(request.getPathInfo()).append("],").append(newLine)
.append("method[").append(request.getMethod()).append("],").append(newLine)
.append("queryString[").append(request.getQueryString()).append("],").append(newLine)
.append("remoteHost[").append(request.getRemoteHost()).append("],").append(newLine)
.append("remoteAddr[").append(request.getRemoteAddr()).append("],").append(newLine)
.append("servletPath[").append(request.getServletPath()).append("],").append(newLine);
// http header값도 로그에 추가
java.util.Enumeration names = request.getHeaderNames();
String headerName;
while (names.hasMoreElements()) {
headerName = (String)names.nextElement();
sb.append(headerName).append("[").append(request.getHeader(headerName)).append("],").append(newLine);
}
sb.append("serverName[").append(request.getServerName()).append("]");
logger.error(sb.toString());
// Exception 정보도 로그에 추가
if (request.getAttribute("javax.servlet.error.exception") == null) {
logger.debug("request.getAttribute('javax.servlet.error.exception') is null");
return; // Return from the JSP servelet handler.
}
// javax.servlet.error.status_code: 에러 상태 코드를 말해 주는 정수이다.
// javax.servlet.error.exception_type: 에러가 생기게 된 예외 형을 지적해 주는 클래스 인스턴스이다.
// javax.servlet.error.message: 예외 메시지를 말해주는 스트링이며, 예외 컨스트럭터로 보내어 진다.
// javax.servlet.error.exception: 실제 예외가 없어지면 버릴 수 있는 객체이다.
// javax.servlet.error.request_uri: 문제를 일으킨 리소스의 URI를 말해주는 스트링이다.
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
logger.error("spring exception", throwable);
%>
결과 화면
17:33:02,150 ERROR spring exception:101 - requestURL[http://localhost:8080/board2/WEB-INF/view/error/exception/exception.jsp]
pathInfo[null],
method[GET],
queryString[null],
remoteHost[0:0:0:0:0:0:0:1],
remoteAddr[0:0:0:0:0:0:0:1],
servletPath[/WEB-INF/view/error/exception/exception.jsp],
accept[*/*],
accept-language[ko-KR],
user-agent[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E)],
accept-encoding[gzip, deflate],
host[localhost:8080],
connection[Keep-Alive],
cookie[JSESSIONID=4218FE934DC460160394497F33DEE71E],
serverName[localhost]
/WEB-INF/view/error/http/exception.jsp 파일에는 다음의 부분만 추가 및 수정하고...
response.setStatus(javax.servlet.http.HttpServletResponse.SC_OK);
Logger logger = Logger.getLogger("http exception");
asp.net mvc 에서는 다음과 같이 global.asax.cs에 넣고 ...
protected void Application_Error(Object sender, EventArgs e)
{
if (Config.RedirectCustomErrorPage)
{
var exception = Server.GetLastError();
var httpException = exception as HttpException;
Response.Clear();
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Errors";
routeData.Values["action"] = "ServerError";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
/*
* 100 Series : Informational
* 200 Series : Success
* 300 Series : Redirection
* 400 Series : Client Error
* 500 Series : Server Error
*/
Response.StatusCode = httpException.GetHttpCode();
if (400 <= Response.StatusCode && Response.StatusCode < 500)
routeData.Values["action"] = "HttpError"; //400대 에러가 들어온다
else
routeData.Values["action"] = "ServerError"; // 500대 에러가 들어온다
}
IController errorController = new ErrorController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorController.Execute(rc);
}
else
{
System.Text.StringBuilder sbErrMsg = new System.Text.StringBuilder();
sbErrMsg.Append("[URL : (");
sbErrMsg.Append(Request.Url.ToString());
sbErrMsg.Append(")][URLRefferrer : (");
sbErrMsg.Append(Request.UrlReferrer.ToString());
sbErrMsg.Append(")][PATH_INFO : (");
sbErrMsg.Append(Request.ServerVariables["PATH_INFO"].ToString());
sbErrMsg.Append(")][REQUEST_METHOD : (");
sbErrMsg.Append(Request.ServerVariables["REQUEST_METHOD"].ToString());
sbErrMsg.Append(")][QUERY_STRING : (");
sbErrMsg.Append(Request.ServerVariables["QUERY_STRING"].ToString());
sbErrMsg.Append(")][HTTP_COOKIE : (");
sbErrMsg.Append(Request.ServerVariables["HTTP_COOKIE"].ToString());
sbErrMsg.Append(")][UserHostName : (");
sbErrMsg.Append(Request.UserHostName.ToString());
sbErrMsg.Append(")][HTTP_USER_AGENT : (");
sbErrMsg.Append(Request.ServerVariables["HTTP_USER_AGENT"].ToString());
sbErrMsg.Append(")][HTTP_ACCEPT_LANGUAGE : (");
sbErrMsg.Append(Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"].ToString());
sbErrMsg.Append(")][SERVER_NAME : (");
sbErrMsg.Append(Request.ServerVariables["SERVER_NAME"].ToString());
sbErrMsg.Append(")]");
Exception exErr = Server.GetLastError();
Logger.GetInstance().Log.Error("(Global.Application_Error) Application Error, ["
+ sbErrMsg.ToString() + "]", exErr);
}
}