2010-02-25 5 views
3

로깅 된 예외 메시지를 기반으로 로깅을 필터링하는 방법은 무엇입니까?예외 메시지에서 log4net 필터링?

코드는 다음과 같습니다

try { 
    someService.DoSomeWorkflow(); 
} catch(Exception e) { 
    log.Error("Hey I have an error", e); 
} 

구성은 다음과 같습니다

<appender name="EventLogger" type="log4net.Appender.EventLogAppender"> 
    <applicationName value="foo" /> 
    <layout type="log4net.Layout.PatternLayout" value="PID:%P{pid}: %message" /> 
    <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="TextInsideTheException" /> 
    </filter> 
</appender> 

내가 ("이봐, 난 오류가")에만 기록 된 메시지를 필터링 할 수 있음을 찾는거야 그러나 예외 메시지를 무시하는 것처럼 보입니다. 이것은 프로덕션 환경에 있으므로 코드를 변경할 수 없으므로 로그 된 메시지를 변경할 수 없습니다. 예외 메시지를 확인하도록 지정하는 구성이 있습니까?

답변

2

... 당신이 라인을 변경할 수 없습니다 보지 못했어요, 당신은 예외 텍스트를 평가하는 필터를 구현할 수 있습니다. 그 문제에 대한 예외 유형.

+0

에 따라 기본 구현입니다. –

0

이 시도 :

log.Error("Hey I have an error: " + e.Message); 

편집 : 죄송합니다, FilterSkeleton 하위 클래스

0

여기 베드로의 허용 대답

using System; 
using log4net.Core; 

namespace log4net.Filter 
{ 
    public abstract class ExceptionFilterBase : FilterSkeleton 
    { 
     public override FilterDecision Decide(LoggingEvent loggingEvent) 
     { 
      if (loggingEvent == null) 
       throw new ArgumentNullException("loggingEvent"); 

      var str = GetString(loggingEvent); 
      if (StringToMatch == null || string.IsNullOrEmpty(str) || !str.Contains(StringToMatch)) 
       return FilterDecision.Neutral; 
      return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny; 
     } 

     protected abstract string GetString(LoggingEvent loggingEvent); 

     public string StringToMatch { get; set; } 

     public bool AcceptOnMatch { get; set; } 
    } 

    public class ExceptionMessageFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.Message; 
     } 
    } 

    public class ExceptionTypeFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.GetType().FullName; 
     } 
    } 

    public class ExceptionStackFilter : ExceptionFilterBase 
    { 
     protected override string GetString(LoggingEvent loggingEvent) 
     { 
      return loggingEvent.ExceptionObject == null 
       ? null : loggingEvent.ExceptionObject.StackTrace; 
     } 
    } 
} 

구성 파일 의미가

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="Client.log" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{yyyy/MM/dd HH:mm:ss,fff} [%-5level] %logger - %message%newline" /> 
    </layout> 
    <filter type="log4net.Filter.StringMatchFilter"> 
    <stringToMatch value="Token is not valid." /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionMessageFilter, YourAssembly"> 
    <stringToMatch value="Application is not installed." /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionTypeFilter, YourAssembly"> 
    <stringToMatch value="System.Deployment.Application.DeploymentException" /> 
    <acceptOnMatch value="false" /> 
    </filter> 
    <filter type="log4net.Filter.ExceptionStackFilter, YourAssembly"> 
    <stringToMatch value="at System.Deployment.Application.ComponentStore.GetPropertyString(DefinitionAppId appId, String propName)" /> 
    <acceptOnMatch value="false" /> 
    </filter> 
</appender>