2014-12-04 24 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進行