2014-12-04 59 views
1

我的应用程序日志,控制台和文件(log4net的1.2.11):更改日志级别而无需添加一个appender

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 

我想更改配置为一类,这样它会记录所有要发送的消息以及除调试消息以外的所有消息。我可以在不为我的课程添加专用appender的情况下做到这一点,并且无需更改根配置,例如记录器的appender-ref级别?

通过this answer启发,我已经试过以下,但没有成功的代码(所有消息,包括调试,将记录到两个附加目的地):

<logger name="MyClass" additivity="false"> 
    <appender-ref ref="ConsoleAppender"> 
    <threshold value="INFO" /> 
    </appender-ref> 
    <appender-ref ref="RollingLogFileAppender" /> 
</logger> 

这也失败(这从所有附加目的地排除调试,我想在文件中调试消息):

<logger name="MyClass"> 
    <level value="INFO" /> 
</logger> 

回答

1

你的运气了,当log4net的解析appender-ref标签不传递任何信息由名称引用的附加器(代码1.2.10) :

// log4net.Repository.Hierarchy.XmlHierarchyConfigurator 
if (xmlElement.LocalName == "appender-ref") 
{ 
    IAppender appender = this.FindAppenderByReference(xmlElement); 
    string attribute = xmlElement.GetAttribute("ref"); 
    if (appender != null) 
    { 
     LogLog.Debug(string.Concat(new string[] 
     { 
      "XmlHierarchyConfigurator: Adding appender named [", 
      attribute, 
      "] to logger [", 
      log.Name, 
      "]." 
     })); 
     log.AddAppender(appender); 
    } 
    else 
    { 
     LogLog.Error("XmlHierarchyConfigurator: Appender named [" + attribute + "] not found."); 
    } 
} 

我敢肯定,你连接到的答案并不真正的工作; appender上存在Treshold属性,但它不在解析节点中分析。

这是最好的 - 你可以想象如果一个记录器可以改变一些appender属性的参考配置噩梦?正在分析的最后一个记录器将赢得配置,祝你好运跟踪为什么你的调试appender现在保持沉默,因为一些其他的记录器交换了临界值:)

所以你必须添加另一个appender;如果您不想复制粘贴RollingLogFileAppender配置,则可以使用forwarding appender作为过滤器,然后将消息传递到自己的引用appender。你最终会与

  • 根日志 - >是ConsoleAppender
  • 根日志 - > RollingFileAppender进行
  • MyClass的 - > ForwardingAppender与过滤器 - >是ConsoleAppender
  • MyClass的 - > RollingFileAppender进行
相关问题