Log4net过滤器不起作用

本文关键字:不起作用 过滤器 Log4net | 更新日期: 2023-09-27 18:02:37

我正在使用log4net,我正在尝试使用过滤器,以便只有一个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);

Log4net过滤器不起作用

来自文档:

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

(强调我的)

由于您没有一个过滤器来拒绝不是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>