2013-07-29 31 views
5

我正在使用log4net來記錄一個項目。爲每個appender創建一個不同的log4net.ilog實例

我想登錄到3個不同的文件:請求,響應和錯誤。

<log4net debug="true"> 
    <!--To turn off an appender, simply set it's threshold value to "OFF"--> 
    <appender type="log4net.Appender.RollingFileAppender" name="RequestAppender"> 
     <file value="requests.txt" /> 
     <threshold value="INFO" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

    <appender type="log4net.Appender.RollingFileAppender" name="ResponseAppender"> 
     <file value="responses.txt" /> 
     <threshold value="INFO" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

    <appender type="log4net.Appender.RollingFileAppender" name="ErrorAppender"> 
     <file value="errors.txt" /> 
     <threshold value="ERROR" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
     </layout> 
    </appender> 

</log4net> 

但是,我不知道如何獲得.NET端每個記錄器的實例。 隨着standrard,1個Appender的配置,我用以下:

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

但這並不指定appenderName就是,我沒有找到一個方法來指定。

任何想法?

謝謝!

編輯: 我想我錯過了一些東西,因爲我沒有定義在我的配置文件中。我不明白記錄員和appender之間的分離。編輯#2: 我注意到一些奇怪的東西。在多個3記錄器配置之前,我有一個記錄器配置。現在,我寫入3個記錄器的文字寫入該日誌文件,儘管它不再位於配置文件中。出於某種原因,它不會加載新的配置文件。我如何強迫它這樣做?

+0

我認爲這是你正在尋找http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files – Microtechie

+0

我也這麼認爲,語法似乎確定,但它不工作。它編譯並運行得很好。但是,所有記錄器的所有isLevelEnabled成員都設置爲TRUE,即使這不是它們的設置方式,我寫入的測試日誌也沒有記錄。 – Niv

+0

試試這個 - [link](http://stackoverflow.com/questions/308436/log4net-programmatically-specify-multiple-loggers-with-multiple-file-appenders) – Nilesh

回答

2

要使用的名稱你想你可以做3名伐木工人:

private static readonly log4net.ILog logError = log4net.LogManager.GetLogger("ErrorAppender"); 
private static readonly log4net.ILog logResponse = log4net.LogManager.GetLogger("ResponseAppender"); 
private static readonly log4net.ILog logRequest = log4net.LogManager.GetLogger("RequestAppender"); 

登錄時必須使用正確的記錄日誌信息。您的appender被配置爲在單獨的文件中處理每個記錄器。

與您當前密碼的問題是:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

因爲你使用靜態記錄器記錄儀的名字大概可以格式不正確。沒有System.Reflection.MethodBase.GetCurrentMethod(),因爲當調用static initalize時,不存在GetCurrentMethod。您可以將其更改爲typeof(..).Name。但是你需要重新配置appender來記錄你的類名。

+0

我有2個問題: 1)讀完位,我注意到我沒有在我的配置中定義一個元素。我應該用定義一個嗎? 2)我現在注意到,使用內部lo​​g4net調試,我的新配置文件根本不佔用 - 它仍然使用舊的配置!我對logError,logResponse,logRequest所做的所有寫作都是使用我使用的舊記錄器發送的(它們被寫入我之前使用的log.txt文件)。我試圖清理我的項目,但它仍然無法正常工作。 – Niv

+1

只需要注意,System.Reflection.MethodBase.GetCurrentMethod()。DeclaringType'在這個上下文中確實有效......它是對記錄器在其中聲明的類的類型進行求值的。所以,你最終會得到像'MyCorp.MyClass'這樣的記錄器名稱,而不是你想要的'ErrorAppender'。 –

相關問題