현재 ASP.NET MVC 응용 프로그램에서 log4net을 사용하여 예외를 기록하고 있습니다. 이 작업을 수행하는 방법은 모든 컨트롤러가 BaseController 클래스에서 상속되도록하는 것입니다. BaseController의 OnActionExecuting 이벤트에서 발생한 모든 예외를 기록합니다.
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
이것은 컨트롤러 작업 중에 처리되지 않은 예외가 발생한 경우 훌륭하게 작동합니다.
404 오류의 경우 web.config에 다음과 같이 사용자 지정 오류가 설정되어 있습니다.
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
그리고 "page-not-found"URL을 처리하는 컨트롤러 작업에서 요청중인 원래 URL을 기록합니다.
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
그리고 이것도 작동합니다.
내가 겪고있는 문제는 .aspx 페이지 자체에있는 오류를 기록하는 방법입니다. 페이지 중 하나에 컴파일 오류가 있거나 예외를 발생시키는 인라인 코드가 있다고 가정 해 보겠습니다.
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
HandleError 특성이 Shared 폴더의 Error.aspx 페이지로 올바르게 다시 라우팅하는 것으로 보이지만 BaseController의 OnActionExecuted 메서드에 의해 확실히 포착되지는 않습니다. Error.aspx 페이지 자체에 로깅 코드를 넣을 수 있다고 생각했지만 해당 수준에서 오류 정보를 검색하는 방법을 잘 모르겠습니다.