2010-10-27 101 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