log4net фильтрация по сообщению об исключении? - PullRequest
3 голосов
/ 25 февраля 2010

Как я могу отфильтровать протоколирование на основе сообщения зарегистрированного исключения?

Код выглядит следующим образом:

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>

IНахожу, что я могу фильтровать только по зарегистрированному сообщению («Эй, у меня есть ошибка»), но оно, похоже, игнорирует сообщение об исключении.Поскольку это в нашей производственной среде, я не могу вносить какие-либо изменения в код, поэтому я не могу изменить зарегистрированное сообщение.Есть ли какая-либо конфигурация, которая указала бы также, чтобы проверить сообщение об исключении?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Используя подклассы FilterSkeleton , вы можете реализовать фильтр, который оценивает текст исключения. Или тип исключения в этом отношении.

0 голосов
/ 03 октября 2016

Вот основные реализации, основанные на принятом ответе Петра

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>
0 голосов
/ 25 февраля 2010

Попробуйте это:

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

Редактировать: Извините, не видел, что вы не можете изменить эту строку ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...