根据情况将log4net登录到不同的appender

GON*_*ale 9 .net c# log4net castle-windsor

我正在使用log4net并且在一个类中需要记录到RollingFile appender,但是在另一个类中,我希望登录到事件日志+滚动文件+控制台appender.

什么是最佳做法?我能看到一些示例代码吗?

为了使事情变得更加困难,我使用Castle Windsor Logging Facility和Log4net来解析我的Logger实例.

如果有帮助的话,我在想下面的内容,但不知道这是不是最好的做法,或者如何基于'name'激活特定的记录器仍然使用来自windsor的当前记录器实例:

log4net.config:

...
    <logger name="EventLogOnly">
      <level value="ALL" />
      <appender-ref ref="EventLogAppender" />
    </logger>
    <logger name="ConsoleEventLog">
      <level value="ALL" />
      <appender-ref ref="ColoredConsoleAppender" />
      <appender-ref ref="EventLogAppender" />
    </logger>
...
Run Code Online (Sandbox Code Playgroud)

城堡windsor容器建造者类:

container.AddFacility("logging.facility", 
   new LoggingFacility(LoggerImplementation.Log4net, "log4net.config"));
Run Code Online (Sandbox Code Playgroud)

要记录的类:

private ILogger Logger;
public Test(ILogger logger) {
  Logger.Info("Can I log under event log only?");
  Logger.Info("Now can I log under both?");
}
Run Code Online (Sandbox Code Playgroud)

多谢你们.

Mic*_*tta 13

您可以通过将过滤器应用于appender来完成此操作.仅当日志事件通过过滤器时,该appender才会记录该事件.

此过滤器配置将仅记录来自名为"MyLogger"的记录器的事件:

<appender name="EventLogAppender" ...
    <filter type="log4net.Filter.LoggerMatchFilter">
        <loggerToMatch value="MyLogger" />
    </filter>       
    <filter type="log4net.Filter.DenyAllFilter" />
</appender>
Run Code Online (Sandbox Code Playgroud)

...这个将匹配日志消息与某些包含的文本:

<filter type="log4net.Filter.StringMatchFilter">
    <stringToMatch value="database" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
Run Code Online (Sandbox Code Playgroud)

过滤器可以进行一些配置.见log4net的SDK,或者的过滤器部分手册,了解更多信息.