9

我想创建一个仅记录特定级别且仅记录特定记录器的附加程序。从我所看到的,并基于本教程,过滤器是 ORed 在一起的。我怎样才能和 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>
4

3 回答 3

9

您可以编写一个自定义的 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" />
于 2012-01-15T00:53:42.330 回答
7

您可以使用 ForwardingAppender(参见配置示例)并将一个过滤器放在那里,另一个放在您的目标附加器中(或随意链接它们)。

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

我相信这个附加程序在问题发生时可能不是 log4net 的一部分。

于 2015-05-18T07:43:41.030 回答
2

Workaround

I just came up with the following workaround that seems to do the trick. First, I removed the loggerToMatch filter from the appender. Then I modified the logger settings as such:

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

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

Since I only have one filter my filter logic is fine. The logger section points to this appender only for my chosen logger, yet all the other appenders pick up the event as well because they're specified in the root. This works but it doesn't explain how to AND the filters together in the appender. I would still like to know.

于 2011-12-28T00:00:44.037 回答