Log4net LoggerMatchFilter - Как фильтровать только в случае «соответствовать целому слову»? - PullRequest
0 голосов
/ 05 марта 2019

Я использую Log4net LoggerMatchFilter для записи информации только из определенного класса.Дело в том, что свойство loggerToMatch использует StartsWith(string) для сравнения, и в результате я получаю журналы также от классов, чье имя начинается с имени моего желаемого класса.Мой конфиг содержит что-то вроде этого:

<filter type="log4net.Filter.LoggerMatchFilter">
    <acceptOnMatch value="true" />      
    <loggerToMatch value="Class.Name.Space.MyClassName" /> 
    </filter>  
<filter type="log4net.Filter.DenyAllFilter" />

В журнале я также получаю строки из классов, таких как: Class.Name.Space.MyClassName123

Есть ли способ отфильтровать с "соответствовать целомуслово "состояние"(Мой код c # .Net 3.5)

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете реализовать такое Filter, например,наследование от LoggerMatchFilter, чтобы вы могли повторно использовать некоторые функции, а вместо этого переопределить алгоритм сопоставления, используя сравнение с полным равенством;loggingEvent.LoggerName == this.LoggerToMatch.

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

namespace PFX.Logging
{
    public class LoggerFullMatchFilter : log4net.Filter.LoggerMatchFilter
    {
        public override FilterDecision Decide(LoggingEvent loggingEvent)
        {
            if (loggingEvent == null)
            {
                throw new ArgumentNullException("loggingEvent");
            }

            if (this.LoggerToMatch != null 
                && this.LoggerToMatch.Length != 0 
                && loggingEvent.LoggerName == this.LoggerToMatch
                )
            {
                if (this.AcceptOnMatch)
                {
                    return FilterDecision.Accept;
                }

                return FilterDecision.Deny;
            }

            return FilterDecision.Neutral;
        }
    }
}

Вы используете этот пользовательский фильтр в своей конфигурации, как показано ниже, указав его полное имя сборки (namespace.class, сборка )

<filter type="PFX.Logging.LoggerFullMatchFilter, Lib">
    <acceptOnMatch value="true" />
    <loggerToMatch value="Class.Name.Space.MyClassName" />
</filter>
...