2010-10-27 93 views
3

我有文件appender FileA,FileB和FileC。 FileA我添加到根元素,因为我希望它是一个捕获所有,(更多在这下面)。 FileB和FileC我用于特定的消息,并为每个appender创建命名记录器。在代码中,我打开日志我使用的大多数消息像这样:使用多个log4net文件记录器

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

其他记录器,我加载像这样

private static readonly log4net.ILog commandLog = log4net.LogManager.GetLogger("LoggerFileB"); 

发生了什么事是我得到我所期望的LoggerFileB,即只有特殊消息。问题是这些消息也出现在LoggerFileA中,我加入到root。我可以为catch-all创建一个特定的命名实例,而不是将其添加到根元素,但我希望调用类型作为输出中的记录器名称。创建命名记录器意味着%记录器输出日志的名称而不是类型。有没有一种方法可以精确地获得我想要的内容(将记录器名称显示为类型,但不显示记录到其他指定记录器的消息)?希望我错过了一些东西,并有一个简单的解决方案。

下面是我的log.config在这种情况下的样子。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <log4net> 
     <appender name="FileA" type="log4net.Appender.RollingFileAppender"> 
      <file value="FileA.txt" /> 
      ...snip... 
     </appender> 
     <appender name="FileB" type="log4net.Appender.RollingFileAppender"> 
      <file value="FileB.txt" /> 
      ...snip... 
     </appender> 
     <appender name="FileC" type="log4net.Appender.RollingFileAppender"> 
      <file value="FileC.txt" /> 
      ...snip... 
     </appender> 
     <root> 
      <level value="ALL" /> 
      <appender-ref ref="LoggerFileA" /> 
     </root> 
     <logger name="LoggerFileB"> 
      <level value="ALL" /> 
      <appender-ref ref="FileB" /> 
     </logger> 
     <logger name="LoggerFileC"> 
      <level value="ALL" /> 
      <appender-ref ref="FileC" /> 
     </logger> 
    </log4net> 
</configuration> 

回答

13

您可以使用设置additivity为false:

<logger name="LoggerFileB" additivity="false"> 
+0

甜!谢谢。我几乎放弃了,正准备走上命名的记录器路线。很高兴我问过! :) – 2010-10-28 12:18:07

+0

谢谢Stefan,我和Tim有同样的问题,你的回答对我有帮助! – pelazem 2011-03-09 20:15:26