2014-03-13 2 views
0

웹 응용 프로그램 프로젝트에서 작업하고 있습니다. 응용 프로그램에는 페이지에서 사용자를 동일한 페이지로 다시 리디렉션하는 단일 단추가 있어야합니다. 버튼을 누를 때마다 매 5 분의 1 (또는 그 부근)에서 프로그램이 예외를 던져서 기록해야합니다.로깅 Visual Studio MVC5

예외를 잡아서 다음 세 가지를 수행해야합니다. 전자 메일을 보내고 오류를 파일에 기록한 다음 디버그 창에 씁니다. 지금까지

내 컨트롤러 :

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      try 
      { 
       RedirectToAction("Index"); 
      } 
      catch (ArgumentException e) 
      { 

      } 
      Random RandNumber = new Random(); 
      int rand = RandNumber.Next(1000); 
      if(rand % 5 == 0) 
      { 
       throw new System.ArgumentException("This is a random excpetion"); 
      } 
      return View(); 
     } 

    } 

아이디어는 클래스 LogMedia의 컬렉션을 선언하고 모든 인스턴스를 순환 클래스 로거를 가지고있는입니다.

클래스 로거 :

윌 그것으로 내 컨트롤러 작업과 함께 지금 약자

public class Logger 
    { 
     List<LogMedia> m_loggers = new List<LogMedia>(); 
     void LogException(Exception ex) 
     { 
      foreach(var i in m_loggers) 
      { 
       //Loop through all Log Media instances 
      } 
     } 

클래스 LogMedia 다음과 같다

당신이 내 질문에

class LogMedia 
    { 
     public virtual void LogMessage(string Message); //virtual function that doesen't do anything 

    } 
    class OutputWindowLogMedia:LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      System.Diagnostics.Debug.WriteLine(Message); 
     } 
    } 
    class TextFileLogMedia : LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      File.AppendAllText("c:\\Temp\\Log.txt", Message); 
     } 
    } 
    class EmailLogMedia : LogMedia 
    { 
     public override void LogMessage(string Message) 
     { 
      //send email 
     } 

    } 
} 
내가 구현하려고하는 것은 무엇입니까? 나는 특히 try catch에 회의적입니다.

이 세 가지 인스턴스를 반복하는 가장 좋은 방법은 무엇입니까?

로그 미디어에 적합한 등급 결정법이 있습니다. 즉, 각 인스턴스에 대해 LogMedia를 상속하는 새 클래스를 만들고 LogMedia의 가상 함수를 재정의하는 함수를 만들어야합니다.

답변

1

이 특정 동작, 컨트롤러 또는 전체 응용 프로그램에서이 동작을 원한다면 명확하지 않습니다. 즉, 논리로 구축하려는 특정 복구 코드가 없으면 내 작업 코드를 try-catch로 오염시키지 않을 것입니다.

은 MVC 프레임 워크는 오류를 처리하기 위해 제공하는 두 가지 옵션이 있습니다

첫째, 당신은 특정 컨트롤러에 OnException 재정의 할 수

protected override void OnException(ExceptionContext filterContext) 
{ 
    // do your logging here 
    // set this flag if you want to stop the exception from bubbling 
    filterContext.ExceptionHandled = true; 
} 

둘째, 당신은 오류 처리 필터를 만들 수 있습니다

필터를 전역 필터 목록에 추가하거나 다음과 같은 작업 방법에 적용 할 수 있습니다.

[MyExceptionFilter] 
public ActionResult Index() 
{ 
} 

편집 : 로거 구조를 언급하는 것을 잊어 버렸습니다. LogMedia의 여러 인스턴스에서 Logger 루프를 사용하는 방법은 하나의 공통 인터페이스 (예 : log4net appender)를 사용하여 여러 로깅 메커니즘을 지원하는 좋은 방법입니다. 즉, 로깅 요구에 대해 기존의 입증 된 프레임 워크를 사용하는 것이 고려 되었습니까? 철저히 테스트 된 프레임 워크를 실행하고 미래의 기술로 이어질 스킬을 얻습니다.

Edit2 : 귀하의 의견을 다음에 예외 추적 방식 대신 코드를 자세히 살펴 보았습니다. 색인 작업에서 조건 확인없이 색인으로 리디렉션하고 있습니다.이것은 일정한 리디렉션 루프로 끝날 것입니다 (IIS가 멈출 때까지). 이것이 과제이므로, 너무 많이주고 싶지는 않지만 버튼 클릭을 감지하고 색인으로 다시 리디렉션하려면 서버 측에서 약간의 논리가 필요합니다. HttpPost를 받아들이는 다른 Index 액션 메소드를 고려하십시오 (현재 액션은 HttpGet 핸들러입니다).

+0

앱은 한 가지만 수행해야하므로 기본적으로 전체 앱에 컨트롤러가 하나만 있습니다. 이것은 학교를위한 프로젝트이며 강사는 내가 게시 한 것과 비슷한 클래스 구조를 시도하고 잡아서 사용하도록 권장했습니다. 나는 우리가 기존의 프레임 워크를 사용하지 않고 우리 자신을 구현할 것으로 생각한다. – user3265963

+0

업데이트 된 응답을 위해 edit2를 참조하라. – maf748

관련 문제