log4net过滤器不起作用

时间:2016-08-15 11:43:07

标签: c# logging log4net

我正在使用log4net,我正在尝试使用过滤器,以便只有一个appender可以写入特定文件。

谁能告诉我为什么这不起作用?我想只有appender叫" ErrorLogFileAppender"写入文件..

<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
   <file value="..\\WebErrors.log" />
   <appendToFile value="true" />
   <rollingStyle value="Size" />
   <maxSizeRollBackups value="2" />
   <maximumFileSize value="10MB" />
   <staticLogFileName value="true" />
   <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
   <layout type="log4net.Layout.PatternLayout">
     <param name="ConversionPattern" value="%d [%t] %-5p %logger{1} %m%n" />
   </layout>

   <filter type="log4net.Filter.LoggerMatchFilter">
     <!-- allows this sub-namespace to be logged... -->
     <loggerToMatch value="ErrorLogFileAppender" />
   </filter>

</appender>

这就是我如何获得应该能够写入文件的记录器:

private static ILog _fileLogger = LogManager.GetLogger("ErrorLogFileAppender");

但是这个记录器(在另一个类中使用)也可以写入同一个文件,这是错误的:

private static ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

1 个答案:

答案 0 :(得分:2)

来自the documentation

  

过滤器形成事件必须通过的链。沿途的任何过滤器都可以接受事件并停止处理,拒绝事件并停止处理,或允许事件进入下一个过滤器。 如果事件在没有被拒绝的情况下到达过滤器链的末尾,则会被隐式接受并将被记录。

(强调我的)

由于您没有使用过滤器拒绝任何 ErrorLogFileAppender的内容,因此所有内容都会被记录下来。您可以通过添加DenyAllFilter

来解决此问题
<filter type="log4net.Filter.LoggerMatchFilter">
  <!-- allows this sub-namespace to be logged... -->
  <loggerToMatch value="ErrorLogFileAppender" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />

或者,您可以配置log4net,以便该记录器使用该appender,例如:

<logger name="ErrorLogFileAppender">
    <appender-ref ref="ErrorLogFileAppender" />
</logger>