2013-07-29 18 views
5

Sto utilizzando log4net per registrare un progetto.Creazione di un'istanza log4net.ILog diversa per ciascun appender

Desidero accedere a 3 file diversi: richieste, risposte ed errori.

<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> 

Tuttavia, non so come ottenere un'istanza per ciascun logger sul lato .NET. Con uno standrard, 1 appender config, ho usato a seguire:

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

Ma questo non specifica l'appenderName, e non ho trovato un modo per specificarlo.

Qualche idea?

Grazie!

MODIFICA: Penso che mi manchi qualcosa in quanto non ho alcuna definizione nel mio file di configurazione. Non capisco la separazione tra i taglialegna e gli appendici.

EDIT # 2: Ho notato qualcosa di strano. Prima della configurazione di 3 logger multipli avevo una configurazione di 1 logger. ora, gli scritti che scrivo nei 3 logger scrivono su quel file di registro, sebbene non sia più nel file di configurazione. Per qualche ragione, non carica il nuovo file di configurazione. Come posso costringerlo a farlo?

+0

Penso che questo sia quello che stai cercando http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files – Microtechie

+0

Lo penso anch'io, e la sintassi sembra ok, ma la sua non funziona. Tuttavia, tutti i membri isLevelEnabled di tutti i logger sono impostati su TRUE anche se non è il modo in cui sono impostati e i registri di test che ho scritto non vengono registrati. – Niv

+0

Prova questo - [collegamento] (http://stackoverflow.com/questions/308436/log4net-programmatically-specify-multiple-loggers-with-multiple-file-appenders) – Nilesh

risposta

2

Per utilizzare i nomi si vuole si può fare 3 logger:

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"); 

Quando ci si collega un messaggio di log è necessario utilizzare il logger corretto. Gli appendic sono configurati per gestire ciascun logger in un file separato.

Il problema con il codice corrente è il:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

Perché si utilizza logger statica i nomi forestale probabilmente non può formate correttamente. Non c'è System.Reflection.MethodBase.GetCurrentMethod() perché quando viene chiamato l'initalize statico non c'è GetCurrentMethod. Puoi cambiarlo in typeof(..).Name. Tuttavia, è necessario riconfigurare gli appendici per registrare i nomi delle classi.

+0

Ho 2 domande: 1) Dopo aver letto un bit, ho notato che non ho definito un elemento nella mia configurazione. Devo definire un con un ? 2) Ora ho notato, usando il debug log4net interno, che il mio nuovo file di configurazione non ha preso affatto - usa ancora la vecchia configurazione! Tutti gli scritti che faccio al logError, logResponse, logRequest sono inviati come se fossero inviati usando il vecchio logger che avevo (sono scritti in un file log.txt che ho usato prima). Ho provato a pulire il mio progetto e ancora non funziona. – Niv

+1

Solo una nota 'System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType' funziona in questo contesto ... è una valutazione per il tipo di classe dichiarata all'interno del logger. Quindi ti ritroverai con un nome logger come "MyCorp.MyClass" invece di "ErrorAppender" come volevi. –