2009-08-06 3 views
3

Log4net은 오류를 발생시키지 않기에 조금 낫습니다. log4net을 시작할 수 없거나 죽고 더 이상 로그 할 수없는 경우 발생시키는 일종의 핸들러를 생성하려고합니다.log4net이 로깅을 중지하면 이벤트를 수신하는 방법

log4net의 내부 디버깅 (log4net.Internal.Debug)을 사용하도록 설정하는 앱 설정 키를 알고 있습니다. log4net에 문제가있는 경우에도 모든 디버깅 정보가 필요하지는 않습니다.

누군가가 프로그래밍 방식으로 log4net에서 오류를 캡처하고 처리 한 방법이 있습니까?

답변

0

Log4net은 로깅 작업 중에 발생하는 예외를 (의도적으로) 억제하므로 매우 어렵습니다. 로그 메시지의 형식을 지정하는 중에 오류로 인해 프로덕션 시스템이 실패하지 않아야하기 때문입니다.

매우 간단한 패턴 레이아웃으로 시도해 볼 가치가 있습니다. 패턴 레이아웃에서 % P {XYZ} 요소를 사용하면 해당 속성이 제대로 설정되지 않은 경우 문제가 발생할 수 있습니다. 간단한 패턴 레이아웃으로 모든 것이 예상대로 작동하면 필요한 물건을 한 번에 하나씩 추가하여 문제를 그렇게 정확하게 지적 할 수 있는지 확인하십시오.

+2

올바른 것으로 보입니다. 몇 번이나 우리가 필요로하는 동안, 우리는 log4net.Internal.Debug를 켜고 있습니다. –

4

당신에게 적합한 방법은 각 appender에 대해 IErrorHandler을 구현하는 클래스를 만든 다음 각 appender가 사용자 정의 오류 처리 클래스를 사용하도록 구성하는 것입니다. 이것은 log4net.Internal.Debug를 활성화하는 것보다 더 많은 제어를 제공해야합니다.

방금 ​​시도했는데 작동합니다 (참고로 내 샘플에서 Logger은 다른 곳에 정의 된 log4net 로거입니다. 그 이유는 SMTP 첨부 파일에서 오류를 캡처하여 파일에 기록하는 것입니다) :

나는 (물론 당신이 너무 설정에서이 작업을 수행 할 수 있습니다) 내 펜더를 구성
using System; 

using log4net.Core; 

namespace Test 
{ 
    public class SmtpErrorHandler : IErrorHandler 
    { 
     public void Error(string message) 
     { 
      Logger.Log.Error(message); 
     } 

     public void Error(string message, Exception ex) 
     { 
      Logger.Log.Error(message, ex); 
     } 

     public void Error(string message, Exception ex, ErrorCode errorCode) 
     { 
      Logger.Log.Error(String.Format("{0}{1}Error code: {2}", message, Environment.NewLine, errorCode), ex); 
     } 
    } 
} 

: 우리는 Logger.Log.Error을 수행하는 우리 자신의 사용자 정의 클래스를 생성

emailAppender.ErrorHandler = new SmtpErrorHandler(); 
0

... 그리고 경우 예외가 발생했거나 오류가 발생하면 원래 오류를 기록하고 Windows 이벤트 로그에 예외가 생겼습니다.

오류를 분석 할 때 사용자는 로그 파일뿐만 아니라 이벤트 로그도 보내야합니다. 우리는 이벤트 로그를 자동으로 내보내고 사용 가능한 모든 Log4net 로그 파일을 zip 파일로 압축하는 도구를 만들었습니다.

0

SCOM (System Center Operations Manager)과 같은 모니터링 도구를 사용하면 로그 파일을 모니터링하고 n 시간/일 이상 변경하지 않았 음을 알리도록 설정할 수 있습니다.

관련 문제