Log4net LoggerMatchFilter - 如何只在“匹配整个单词”的情况下过滤?

问题描述 投票:1回答:1

我正在使用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)

.net filter log4net log4net-appender
1个回答
2
投票

您可以通过例如实现这样的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,assembly)

<filter type="PFX.Logging.LoggerFullMatchFilter, Lib">
    <acceptOnMatch value="true" />
    <loggerToMatch value="Class.Name.Space.MyClassName" />
</filter>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.