내 ASP.Net MVC 1.0 응용 프로그램에서 오류 처리와 결합 된 예외 로깅을 수행하는 간단한 솔루션을 찾고 있습니다.오류 처리와 함께 ASP.Net MVC 예외 로깅
여기에는 StackOverflow에 게시 된 질문을 비롯하여 다양한 상황에 대한 다양한 솔루션을 제공하는 기사가 많이 있습니다. 나는 아직도 나의 필요에 맞는 해결책을 찾을 수 없다. 여기
내 요구 사항 :액션 또는 뷰의에서 발생 될 수있는 모든 예외를 처리하기 위해, 내 컨트롤러에 [는 handleError] 속성 (또는 이에 해당하는)를 사용 할 수 있으려면 . 이것은 모든 Action에서 특별히 처리되지 않은 모든 예외를 처리해야합니다 (2 번에서 설명). 컨트롤러의 모든 작업에 대해 오류가 발생한 경우 사용자가 어떤보기로 리디렉션되어야하는지 지정할 수 있습니다.
특정 조치의 맨 위에 [HandleError] 특성 (또는 이와 동등한 것)을 지정하여 예외에 적합한 예외로 사용자를 리디렉션 할 수 있기를 원합니다. 다른 모든 예외는 여전히 컨트롤러의 [HandleError] 속성에 의해 처리되어야합니다.
위의 두 가지 경우 모두 log4net (또는 다른 로깅 라이브러리)을 사용하여 예외가 기록되도록하고 싶습니다.
위의 목표를 달성하려면 어떻게해야합니까? 모든 Controllers를 OnException 메서드를 재정의하는 기본 컨트롤러에서 상속받으며 내 로깅을 수행하는 방법에 대해 읽었습니다. 그러나 이것은 사용자를 적절한 뷰로 리다이렉트 시키거나 지저분 해 지도록 만들 것이다.
이 문제를 처리하기 위해 IExceptionFilter를 구현하는 자체 Filter Action을 작성했지만이 문제는 [HandleError] 속성과 충돌합니다.
지금까지 내 생각에 가장 좋은 해결책은 HandleErrorAttribute에서 상속받은 내 자신의 특성을 작성하는 것입니다. 그렇게하면 [HandleError]의 모든 기능을 사용할 수 있으며 내 자신의 log4net 로깅을 추가 할 수 있습니다. 해결책은 다음과 같습니다.
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
위 코드가 내 요구 사항에 부합합니까? 그렇지 않은 경우 어떤 솔루션이 내 요구 사항을 충족합니까?
니스, 대단히 감사합니다. 저는 이것을 사용할 것입니다. – Kezzer
이 코드에는 RouteData.Values [ "action"]에 대해 null이 반환되지 않는다고 가정하는 버그가있는 것으로 의심됩니다. --ToString()을 호출하면 오류 처리기가 NullReferenceException을 throw 할 수 있습니다. 오류 처리기가 오류를 발생시키는 것보다 더 실망스러운 것은 없습니다. –