2009-03-16 17 views
58

Ho un programma che effettua molte chiamate log4net ai logger "myprogram". Chiama anche un altro codice che effettua chiamate log4net ad altri logger. Voglio catturare tutti i registri superiori a INFO per "mioprogram" e tutti i registri superiori a WARN per tutto il resto. In questo modo, ottengo i messaggi di work-in-progress specifici per l'attività su cui sto lavorando, ma mi viene comunque notificata la presenza di eventi potenzialmente dannosi nel codice di supporto. Voglio che venga inviato a entrambi Console e un file di registro.Eliminare la registrazione duplicata in log4net

Ho la seguente configurazione log4net:

<log4net> 
    <root> 
     <level value="WARN" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </root> 
    <logger name="myprogram"> 
     <level value="INFO" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </logger> 
    <appender name="Console" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message%newline" /> 
     </layout> 
     <threshold value="INFO" /> 
    </appender> 
    <appender name="LogFile" type="log4net.Appender.RollingFileAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" /> 
     </layout> 
     <appendToFile value="false" /> 
     <staticLogFileName value="true" /> 
     <rollingStyle value="Once" /> 
     <file value="mylogfile" /> 
     <immediateFlush value="true" /> 
     <threshold value="INFO" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    </appender> 
</log4net> 

Questo ha perfettamente senso per me: log> WARN per tutto e> INFO per la specifica "myprogram" logger.

Il problema è che sto ricevendo messaggi INFO registrati due volte su Console e LogFile. Questo succede solo se ho entrambi gli elementi <root> e <logger> riempiti; se rimuovo uno dei due, il rimanente funziona come mi aspetto.

Ho potuto capire se stavo registrando due volte le voci WARN (poiché il mio programma corrisponde sia a "root" che a "mioprogramma"), ma sta accadendo su INFO anche se ROOT è (presumibilmente) impostato su WARN.

Sto facendo qualcosa di sbagliato qui, o si tratta di un bug/ambiguità log4net?

risposta

72

Si viene duplicati perché si sta dicendo di registrare i messaggi due volte. Non suggerirei usando additività qui poiché potrebbe verificarsi alcuni effetti collaterali, è sufficiente rimuovere la configurazione inutili:

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram"> 
    <level value="INFO" /> 
</logger> 

Non è necessario indicare l'appender-ref nel myprogram logger dal momento che li erediterà dal logger root; se li specifichi di nuovo, si registrerà due volte.

+0

Questo ha funzionato bene per me quando ho riscontrato lo stesso problema. Questo evita anche il problema dell'additività –

+1

Questa è la risposta corretta. I logger ereditano gli allegati da root. Grazie! –

+1

@Jeffrey sei consapevole di quali sono i problemi con l'utilizzo di additività? Non ho avuto successo nel trovare qualcosa di documentato di cui Google sia a conoscenza. – Tinister

67

Provare con questa modifica, impostando l'additività su false.

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</logger> 
+1

Questo l'ha fatto; grazie un pacco –

+2

Questo è un buon modo per assicurarsi che tutti i messaggi registrati nel registro "myprogram" non siano visualizzati nel log di root. – Llyle

+0

Grazie a questo ho risolto il problema che stavo cercando su Google. – Kugel

Problemi correlati