我正在使用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);
答案 0 :(得分:2)
过滤器形成事件必须通过的链。沿途的任何过滤器都可以接受事件并停止处理,拒绝事件并停止处理,或允许事件进入下一个过滤器。 如果事件在没有被拒绝的情况下到达过滤器链的末尾,则会被隐式接受并将被记录。
(强调我的)
由于您没有使用过滤器拒绝任何不 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>