log4net 过滤器 - 如何编写 AND 过滤器以忽略日志消息

标签 log4net log4net-configuration log4net-filter

我正在努力在 log4net 中编写 AND 条件过滤器。如果是 nLog,我可以这样写:

<logger name="*" minlevel="Info" xsi:type="NLogLoggerRule" writeTo="FooLogger" >
  <filters>
    <when condition="equals('${event-context:item=UserID}', 'TESTUSER') 
                 and equals('${event-context:item=URL}','/foo/foobar.aspx')" 
          action="Ignore" />
  </filters>
</logger>

我不确定如何在 log4net 中编写相同的过滤器。到目前为止,我已经成功地写了一个条件:

<appender>
   ....
   <filter type="log4net.Filter.PropertyFilter">
      <key value="URL" />
      <stringToMatch value="/foo/foobar.aspx" />
      <acceptOnMatch value="false" />
   </filter>
</appender>

如何使用 log4net 过滤器编写 AND 条件?请帮忙。

最佳答案

支持 AND 条件的自定义过滤器。此类公开 Filter 属性,因此可以在此处使用现有的 log4net 过滤器,如果需要,还可以嵌套 AND 条件。

public class AndFilter : FilterSkeleton
{
    private bool acceptOnMatch;
    private readonly IList<IFilter> filters = new List<IFilter>();

    public override FilterDecision Decide(LoggingEvent loggingEvent)
    {
        if (loggingEvent == null)
            throw new ArgumentNullException("loggingEvent");

        foreach(IFilter filter in filters)
        {
            if (filter.Decide(loggingEvent) != FilterDecision.Accept)
                return FilterDecision.Neutral; // one of the filter has failed
        }

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

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

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

配置:

<filter type="Namespace.AndFilter, Assembly">
  <filter type="log4net.Filter.PropertyFilter">
    <key value="URL" />
    <stringToMatch value="/foo/foobar.aspx" />
  </filter>
  <filter type="log4net.Filter.PropertyFilter">
    <key value="UserID" />
    <stringToMatch value="TESTUSER" />
  </filter>
  <acceptOnMatch value="false" />
</filter>

关于log4net 过滤器 - 如何编写 AND 过滤器以忽略日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8604041/

相关文章:

c# - Log4Net:以编程方式指定多个记录器(具有多个文件附加程序)

logging - 如何将AND和Log4net过滤器组合在一起

c# - Log4net自定义过滤器不过滤

c# - log4net - 配置忽略来自特定线程的消息

C# 扩展 Log4net ILog 接口(interface)的现有方法

特定异常类型的 Log4Net appender 过滤器?

c# - 如何使用log4net创建log.txt?

web-config - 如何配置与 Log4Net 集成的 Quartz.Net 版本 2.1.2.0

c# - log4net 按 threadcontext 属性过滤(.NET Core)