2009-07-23 9 views
12

Ho impostato un logfileAppender e un consoleAppender nella mia configurazione di log4net per la mia applicazione. Vorrei che l'appender del file di log scrivesse solo i messaggi ERROR e sopra e l'appender della console per scrivere DEBUG e sopra.La soglia dell'appender Log4net non funziona

La mia configurazione è:

<log4net debug="false"> 

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d %m%n" /> 
    </layout> 
</appender> 


<root> 
    <priority value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="LogFileAppender" /> 
</root> 

</log4net> 

Ho constatato che sia ERROR e DEBUG viene emesso al mio file di log appender. Come limitarlo solo a ERRORE?

+0

Hai provato il filtro ho suggerito nella mia risposta ? Non ha fatto differenza? –

+0

Ho creato un'applicazione di console di esempio utilizzando la configurazione di log4net e sto ottenendo il comportamento esatto che sembra non volere .... vedere la mia risposta di seguito. – Darragh

risposta

8

Si noti inoltre che il tag level nel logger non funziona allo stesso modo di threshold o LevelMatchFilter.

Level indica quali istruzioni di registro verranno effettivamente generate. Questo è ciò che puoi testare nel tuo codice.

Threshold d'altra parte, filtra tutti i messaggi di registro che scende sotto la soglia.

Ciò significa che avere una soglia superiore al livello di logger più elevato non ha senso. Ho visto molte volte come si imposta un livello di INFO (perché è quello che verrà utilizzato dalla maggior parte degli appenders), quindi creare un appender con una soglia di DEBUG. E poi ti sorprendi quando nessun messaggio DEBUG appare effettivamente nell'appender ...

6

Per ottenere un filtro molto specifico per un appender, è necessario configurare uno per l'appender del file di log per filtrare gli eventi effettivamente in uscita.
Per esempio:

<filter type="log4net.Filter.LevelRangeFilter"> 
    <levelMin value="ERROR"/> 
    <levelMax value="FATAL"/> 
</filter> 

o

<filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR"/> 
</filter> 

mettere uno di questi all'interno del tag <appender>, e questo dovrebbe funzionare per voi:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <filter type="log4net.Filter.LevelMatchFilter"> 
     <levelToMatch value="ERROR"/> 
    </filter> 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <threshold value="ERROR"/> 
</appender> 

Nota: aggiornato per rimuovere errore ha sottolineato fuori da kgiannakakis.

+0

@ Dav.evans, puoi confermare che quanto sopra è la configurazione completa? Quali registratori stai usando? È sicuro che non vengano apportate modifiche di configurazione al codice nel tuo codice? –

+0

stessa domanda/risposta: http://stackoverflow.com/questions/6007/log4net-configuring-log-level –

0

È necessario utilizzare la proprietà additivity. Vedi here per un esempio. È necessario definire due logger.

+0

Ma logfile è un Appender e l'additività riguarda i logger. –

+0

Ho corretto questo. Realmente crei due logger, ciascuno con un appender e usa la proprietà di additività. – kgiannakakis

+0

sicuramente no. Qual è lo scopo dell'elemento soglia quindi? –

2

Le risposte che si ricevono sono parzialmente corrette. Lo Threshold viene utilizzato solo per impostare un limite inferiore sul livello aggiunto. Una soglia di ERRORE riceverà effettivamente ERROR e FATAL (che è "sopra" ERROR).

Si desidera implementare uno LevelMatchFilter con un valore di livello di "ERRORE" (e "DEBUG" per l'altro appender). Tuttavia, devi aggiungere anche uno DenyAllFilter alla fine della catena di filtri.
Per esempio:

<appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
    <param name="File" value="log.txt" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout,log4net"> 
    <param name="ConversionPattern" value="%d %M - %m%n" /> 
    </layout> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="ERROR" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

ho dovuto implementare il DenyAllFilter dal log4net 1.2.10 (potete vedere la domanda che ho avuto su questo argomento here).

+0

Maestrean Questo non funziona con la versione più recente di log4net. – BradLaney

+0

Ho usato questo e ha funzionato nella versione 1.2.13.0. –

4

Ho creato un'applicazione di console di esempio utilizzando la tua configurazione di log4net e sto ottenendo il comportamento esatto che ti sembra di volere ....

using System; 
using System.IO; 
using log4net; 
using log4net.Config; 

namespace SO_1171258 
{ 
    class Program 
    { 
     private static readonly ILog log = LogManager.GetLogger(typeof(Program)); 

     static void Main() 
     { 
      XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString())); 
      log.Error(new Exception("error log statment")); 
      log.Debug("debug log statment"); 
     } 
    } 
} 

Quando eseguo questa applicazione, l'unica cosa al file di log è:

2014-01-27 15: 02: 51.387 principale - System.Exception: Registro errori statment

E alla schermata vedo:

2014-01-27 15: 05: 52.190 System.Exception: registro errori statment

2014/01/27 15: 05: 52.218 di debug log statment

Ecco la totalità del mio file app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 
    </configSections> 
    <log4net debug="false"> 

    <appender name="LogFileAppender" type="log4net.Appender.FileAppender,log4net" > 
     <param name="File" value="log.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" value="%d %M - %m%n" /> 
     </layout> 
     <threshold value="ERROR"/> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d %m%n" /> 
     </layout> 
    </appender> 


    <root> 
     <priority value="DEBUG" /> 
     <appender-ref ref="ConsoleAppender" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 

    </log4net> 
</configuration>