log4net 过滤器不起作用

log4net filter doesnt work

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

谁能告诉我为什么这不起作用?我只想将名为 "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");

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

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

来自the documentation

Filters form a chain that the event has to pass through. Any filter along the way can accept the event and stop processing, deny the event and stop processing, or allow the event on to the next filter. If the event gets to the end of the filter chain without being denied it is implicitly accepted and will be logged.

(强调我的)

由于您没有适当的过滤器来拒绝 不是 ErrorLogFileAppender 的任何内容,所有内容仍将被记录下来。您可以通过包含 DenyAllFilter:

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

或者,您可以配置 log4net,以便只有那个记录器使用那个附加程序,例如:

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