Logging 如何将日志和log4net过滤器组合在一起

Logging 如何将日志和log4net过滤器组合在一起,logging,log4net,log4net-configuration,log4net-filter,Logging,Log4net,Log4net Configuration,Log4net Filter,我想创建一个appender,它只记录特定级别和特定记录器的日志。从我所看到的,并基于,过滤器是OR在一起。我如何才能和log4net过滤器一起使用?下面是我正在做的一个例子: <appender name="MyAppender"> <!--log only INFO level--> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch

我想创建一个appender,它只记录特定级别和特定记录器的日志。从我所看到的,并基于,过滤器是OR在一起。我如何才能和log4net过滤器一起使用?下面是我正在做的一个例子:

<appender name="MyAppender">
      <!--log only INFO level-->
      <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch value="INFO" />
      </filter>

      <!--log only UserController logger-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyLogger" />
      </filter>

      <!-- do not log anything else -->
      <filter type="log4net.Filter.DenyAllFilter" />
</appender>

解决方法 我刚刚想出了下面的解决办法,似乎可以做到这一点。首先,我从appender中删除了loggerToMatch过滤器。然后,我修改了记录器设置,如下所示:

<root>
      <level value="ALL" />
      <appender-ref ref="OtherAppenders" />
</root>

<logger name="MyLogger">
      <level value="INFO" />
      <appender-ref ref="MyAppender" />
</logger>


因为我只有一个过滤器,所以我的过滤器逻辑很好。logger部分仅针对我选择的logger指向此appender,但所有其他appender也会拾取事件,因为它们是在根目录中指定的。这是可行的,但它没有解释如何在appender中同时使用和过滤器。我仍然想知道。

您可以编写一个自定义AndFilter,这相当简单。您可以使用此处发布的代码-

用法如下:

<filter type="Namespace.AndFilter, Assembly">
      <!--log only INFO level-->
      <filter type="log4net.Filter.LevelMatchFilter">
          <levelToMatch value="INFO" />
      </filter>

      <!--log only UserController logger-->
      <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyLogger" />
      </filter>
      <acceptOnMatch value="true"/>
</filter>
<!-- do not log anything else -->
<filter type="log4net.Filter.DenyAllFilter" />

您可以使用ForwardingAppender(请参阅),将一个过滤器放在那里,另一个放在目标appender中(或随意链接它们)



我相信这个appender在提出问题时可能不是log4net的一部分。

听起来不太糟糕,但我很惊讶log4net中没有内置这种功能
<appender name="FilterOnlyInfo" type="log4net.Appender.ForwardingAppender">
  <!--log only INFO level-->
  <filter type="log4net.Filter.LevelMatchFilter">
      <levelToMatch value="INFO" />
  </filter>
  <appender-ref ref="FinalAppender" />
</appender>
<appender name="FinalAppender">
  <!--log only UserController logger-->
  <filter type="log4net.Filter.LoggerMatchFilter">
    <loggerToMatch value="MyLogger" />
  </filter>
</appender>