Как игнорировать журналы, когда некоторые LogicalThreadContext.Property имеют определенное значение в log4net - PullRequest
0 голосов
/ 15 января 2020

Я использую ADO. NET appender с MySQL в качестве серверной базы данных

Я добавил следующее в настройках своего приложения

<parameter>
      <parameterName value="_context" />
      <dbType value="String" />
      <size value="25" />
      <layout type="log4net.Layout.RawPropertyLayout">
        <key value="Context" />
      </layout>
    </parameter>

    <filter type="log4net.Filter.PropertyFilter">
      <key value="Context" />
      <stringToMatch value="Transaction" />
      <acceptOnMatch value="false" />
    </filter>

Что я делаю, так это регистрирую множество сценарий. Но я хотел пропустить журналы, идущие к команде БД, когда свойство Context имеет значение = "Транзакция"

Но, похоже, оно не работает. Пожалуйста, дайте мне знать, что мне нужно исправить

PS

Я даже попробовал следовать

public class CustomFilter : FilterSkeleton
{

    private readonly IList<IFilter> filters = new List<IFilter>();        
    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        if (loggingEvent == null)
            throw new ArgumentNullException("loggingEvent");

        if (filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept))
        {
            return FilterDecision.Neutral;
        }

        // All conditions are true
        if (AcceptOnMatch)
            return FilterDecision.Accept;
        else
            return FilterDecision.Deny;
    }

    public IFilter Filter
    {
        set { filters.Add(value); }
    }

    public bool AcceptOnMatch { get; set; }

}

с

  <filter type="MyNameSpace.CustomFilter,  MyAssembly">

      <filter type="log4net.Filter.PropertyFilter">
        <key value="Context" />
        <stringToMatch value="Transaction" />
        <acceptOnMatch value="false" />
      </filter>      
    </filter>
    <filter type="log4net.Filter.LevelRangeFilter">
      <acceptOnMatch value="true" />
      <levelMin value="DEBUG" />
      <levelMax value="FATAL" />
    </filter>

1 Ответ

1 голос
/ 16 января 2020

Так что в конце концов это возможно.

Существует loggingEvent.GetProperties(), который дает настраиваемые поля.

Вы CustomFilter могли бы выглядеть примерно так:

    public class CustomFilter : FilterSkeleton
    {
        private readonly IList<IFilter> _filters = new List<IFilter>();
        public override FilterDecision Decide(LoggingEvent loggingEvent)
        {
            if (loggingEvent == null)
                throw new ArgumentNullException(nameof(loggingEvent));

            var properties = loggingEvent.GetProperties();
            if (properties != null && (properties[Key] as string ?? properties[Key]?.ToString()) == StringToMatch )
            {
                return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
            }

            if (_filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept))
            {
                return FilterDecision.Neutral;
            }

            // All conditions are true
            return AcceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
        }

        public IFilter Filter
        {
            set => _filters.Add(value);
        }

        public bool AcceptOnMatch { get; set; }

        public string Key { get; set; }
        public string StringToMatch { get; set; }
    }

Я не тестировал его с несколькими фильтрами, но это только начало.

...