2012-06-02 3 views
2

실행하는 데 오랜 시간이 걸리고 요청 시간 제한을 트리거하는 일부 동기 코드가있는 .aspx 페이지가 있습니다. 예를 들어 :다른 .aspx 페이지에서 가져온 Global.asax에서 log4net 로깅 정보를 얻으려면 어떻게해야합니까?

Global.asax에서
protected void Page_Load(object sender, EventArgs e) 
{ 
    var log = LogManager.GetLogger("test"); 
    log.Debug("Before thread sleep..."); 
    Thread.Sleep(99999999); 
    log.Debug("After thread sleep."); 
} 

, 나는 이메일 것이다 밖으로 예외 일부 오류 처리를 추가했습니다 :

문제는, Global.asax 년을, 난 단지 요청에 액세스 할 수 응답 및 발생한 예외는 있지만 로거의 출력은 아닙니다. Global.asax에서 어떻게 액세스 할 수 있습니까? 그것 없이는 어떤 코드가 로그 파일을 파기하지 않고 애플리케이션을 걸고 있는지 알 수 없다.

답변

0

'log'객체는 정적 변수이며 Global.asax Application_Error()에서 가져 오기를 시도하는 것이 올바르지 않습니다. 스레드 풀의 현재 스레드에 따라 예측할 수없는 값이 나타날 수 있습니다. log.Debug()와 함께 HttpContext.Current.Items에 디버그 데이터를 삽입하는 것이 더 안전 할 수 있습니다. 그런 다음 Application_Error() 메소드에서이 항목에 액세스 할 수 있습니다. Context.Items는 스레드로부터 안전하며이 경우 사용할 것을 권장합니다.

+0

감사합니다. Tisho. 'HttpContext.Current.Items'를 사용하는 것이 저에게 효과적으로 보입니다. –

0

또 다른 방법은 log4net이 전자 메일 첨부자를 사용하여 전자 메일을 보내도록하는 것입니다. 다음 예를 참조하십시오. http://sradack.blogspot.co.uk/2007/09/have-log4net-send-email-when-error.html

+0

이 방법의 문제점은'_logger.Error()'줄을 치고 있다고 가정한다는 것입니다. 내 경우,'InternalDoSomethingImportant()'는 ASP.NET 기본 타임 아웃을 초과 할만큼 프로세스를 오랫동안 차단하고 있습니다. 나는 많은 메소드 호출 중 어느 것이 블록을 처리하는지 알지 못한다. –

+0

그런 경우 실행하기 전에 httpcontext 항목에 조치 이름을 기록하고 오류 메시지에 포함 시키십시오. –

+0

다음 각 로거 메시지에 대해 전자 메일을받지 못합니까? 예를 들어'Before thread sleep ... '과'After thread sleep.'에 대한 전자 메일을 보겠습니다. –

관련 문제