如何将AND log4net过滤器放在一起

时间:2011-12-27 23:41:13

标签: logging log4net log4net-configuration log4net-filter

我想创建一个仅针对特定级别记录的appender,仅针对特定记录器。从我所看到的,基于this tutorial,过滤器被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>

3 个答案:

答案 0 :(得分:8)

您可以编写自定义的AndFilter,这非常简单。您可以使用此处发布的代码 - https://stackoverflow.com/a/8859037/984438

用法如下:

<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" />

答案 1 :(得分:7)

您可以使用ForwardingAppender(请参阅Config examples)并在其中放置一个过滤器,另一个放在目标appender中(或随意链接它们)。

<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>

我相信在问题出现时,这个appender可能不会成为log4net的一部分。

答案 2 :(得分:2)

解决方法

我刚刚提出了以下解决方法,似乎可以解决这个问题。首先,我从appender中删除了loggerToMatch过滤器。然后我修改了记录器设置:

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

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

由于我只有一个过滤器,我的过滤器逻辑很好。记录器部分仅针对我选择的记录器指向此appender,但所有其他appender也会选择该事件,因为它们是在根目录中指定的。这有效,但它没有解释如何在appender中将过滤器和过滤器结合在一起。我还是想知道。