пятница, 25 апреля 2008 г.

Написание своего фильтра для log4net

Например, я использую NHibernate. Он использует log4net чтобы выводить свои сообщения, а я использую log4net для своих целей. И куча хибернейтовских сообщений мне мешают. Очевидное решение данной проблемы - написать собственный фильтр. Фильтр должен наследоваться от абстрактного класса FilterSkeleton. Вот, что получилось у меня:

using System;
using log4net.Filter;

namespace Common
{
  class SourceFilter : FilterSkeleton
  {
    private string source;
    private bool acceptOnMatch;

    public string Source
    {
      get { return source; }
      set { source = value; }
    }

    public bool AcceptOnMatch
    {
      get { return acceptOnMatch; }
      set { acceptOnMatch = value; }
    }

    public override FilterDecision Decide(log4net.Core.LoggingEvent loggingEvent)
    {
      if (loggingEvent.LocationInformation.ClassName.Contains(source) == acceptOnMatch)
        return FilterDecision.Accept;
      else
        return FilterDecision.Deny;
    }
  }
}
После этого можно в Web.config добавить в appender следующее:
<filter type="Orpo.Common.SourceFilter">
  <Source value="NHibernate"/>
  <AcceptOnMatch value="false"/>
</filter>
Все, фильтр готов, сообщения из источника NHibernate никуда не выводятся.

2 комментария:

Eduard Kibort комментирует...

Хороший пример. Кстати эту же задачу можно решить и стандартным фильтром.
<filter type="log4net.Filter.LoggerMatchFilter">
<LoggerToMatch value="NHibernate"/>
<acceptOnMatch value="false"/>
</filter>

Анонимный комментирует...

Можно еще так.





Дарья, ваши статьи очень интересны и полезны. Благодарю вас.