gerarchia log4net e livelli di registrazione


127

Questo sito dice

Ai logger possono essere assegnati livelli. I livelli sono istanze della classe log4net.Core.Level. I seguenti livelli sono definiti in ordine di priorità crescente :

  • TUTTI
  • DEBUG
  • INFORMAZIONI
  • AVVISARE
  • ERRORE
  • FATALE
  • OFF

DEBUG sembra avere la priorità più bassa ed ERRORE è più alto.

Domanda

  • Se imposto Min e Max come esempio DEBUG ed ERRORE, stampa tutto DEBUG, INFO, WARN ed ERRORE. Senza l'uso di filtri min e max. Se specifico ERRORE (Livello di registrazione = ERRORE) Includerà DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Invece di filtro min e max. È possibile configurare un livello e includere tutti gli altri livelli sottostanti per la registrazione.

Esempio: impostare il livello come errore includerà DEBUG, INFO, WARN ed ERROR. È possibile con log4net?

Pubblicazione della configurazione di log4net in base a uno dei commenti:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
        </configSections >
        <log4net debug="true">
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <layout type="log4net.Layout.XMLLayout" /> -->
        <param name="File" value="TestLog.log" />
        <param name="AppendToFile" value="false" />
        <layout type="log4net.Layout.PatternLayout">
            <header type="log4net.Util.PatternString" value="[START LOG] %newline" />
            <footer type="log4net.Util.PatternString" value="[END LOG] %newline" />
            <conversionPattern value="%d [%t] %-5p - %m%n" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG"/>
            <param name="LevelMax" value="ERROR"/>
        </filter>
    </appender>
<root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </root>
    <logger name="log4NetExample">
        <!-- <appender-ref ref="B" /> -->
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
    </logger>
</log4net>


hai provato a impostare il livello di registrazione su INFO e verificato se include INFO e DEBUG?
Predefinito

5
DEBUG sembra avere la priorità più bassa e Error è la più alta. Questa non è una priorità , ma verrà registrata una soglia superiore o superiore a un messaggio.
R. Schreurs,

Hai provato a usare solo levelMax? Penso che ciò dovrebbe includere tutto sotto se non si specifica unlevelMin
AN

Risposte:


90

Questo potrebbe aiutare a capire cosa viene registrato a quale livello ai Logger possono essere assegnati livelli. I livelli sono istanze della classe log4net.Core.Level. I seguenti livelli sono definiti in ordine di gravità crescente: Livello registro.

Numero di livelli registrati per ciascun livello di impostazione:

 ALL    DEBUG   INFO    WARN    ERROR   FATAL   OFF
All                        
DEBUG  DEBUG                  
INFO   INFO   INFO               
WARN   WARN   WARN   WARN           
ERROR  ERROR  ERROR  ERROR  ERROR      
FATAL  FATAL  FATAL  FATAL  FATAL  FATAL  
OFF    OFF    OFF    OFF    OFF    OFF    OFF

2
Scusa, pensavo fosse wswg, perché no ??
Mel Pama,

1
Puoi dare un'occhiata a questa parte del sito per una corretta formattazione delle risposte
Jarod Moser,

36

Per la maggior parte delle applicazioni si desidera impostare un livello minimo ma non un livello massimo.

Ad esempio, quando si esegue il debug del codice, impostare il livello minimo su DEBUG e in produzione impostarlo su WARN.


Si prega di controllare la mia domanda aggiornata, La mia domanda è per livelli e dichiarazioni di registro
Siva

Cambia <level value="ALL" /> in <level value="WARN" />e otterrai solo gli avvisi e gli errori.
Ilya Kogan,

2
No, non aiuta. Ho provato a cambiare. Non ho visto i registri per la priorità inferiore inclusa
Siva

12
Ovviamente non vedrai i log sotto la priorità. Questa è una priorità minima che stai impostando.
Ilya Kogan,

19

DEBUG mostrerà tutti i messaggi, INFO tutti oltre ai messaggi DEBUG e così via.
Di solito si usa INFO o WARN. Ciò dipende dalla politica aziendale.


Controlla la mia domanda aggiornata, La mia domanda è per livelli e dichiarazioni di registro
Siva,

Pubblica la tua intera configurazione log4Net, potresti avere due logger che stanno interferendo.
weismat

E finora ho usato personalmente solo l'impostazione del livello. Penso che le impostazioni Min / Max dovrebbero essere evitate se possibile.
weismat

Ho pubblicato l'intera configurazione di log4net. Si prega di controllare. Sto cercando di imparare e implementare.
Siva,

16

Ecco un po 'di codice che parla della priorità di tutti i livelli di log4net:

TraceLevel(Level.All); //-2147483648

TraceLevel(Level.Verbose);   //  10 000
TraceLevel(Level.Finest);    //  10 000
    
TraceLevel(Level.Trace);     //  20 000
TraceLevel(Level.Finer);     //  20 000
    
TraceLevel(Level.Debug);     //  30 000
TraceLevel(Level.Fine);      //  30 000
    
TraceLevel(Level.Info);      //  40 000
TraceLevel(Level.Notice);    //  50 000
    
TraceLevel(Level.Warn);      //  60 000
TraceLevel(Level.Error);     //  70 000
TraceLevel(Level.Severe);    //  80 000
TraceLevel(Level.Critical);  //  90 000
TraceLevel(Level.Alert);     // 100 000
TraceLevel(Level.Fatal);     // 110 000
TraceLevel(Level.Emergency); // 120 000
    
TraceLevel(Level.Off); //2147483647


private static void TraceLevel(log4net.Core.Level level)
{
   Debug.WriteLine("{0} = {1}", level, level.Value);
}


10

Come altri hanno notato, è generalmente preferibile specificare un livello di registrazione minimo per registrare quel livello e tutti gli altri più severi di esso. Sembra che tu stia solo pensando ai livelli di registrazione all'indietro.

Tuttavia, se si desidera un controllo più dettagliato sulla registrazione dei singoli livelli, è possibile indicare a log4net di registrare solo uno o più livelli specifici utilizzando la sintassi seguente:

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

Oppure per escludere un livello di registrazione specifico aggiungendo un nodo "nega" al filtro.

È possibile impilare più filtri insieme per specificare più livelli. Ad esempio, se volevi solo i livelli WARN e FATAL. Se i livelli desiderati erano consecutivi, LevelRangeFilter è più appropriato.

Documento di riferimento: log4net.Filter.LevelMatchFilter

Se le altre risposte non ti hanno dato abbastanza informazioni, speriamo che questo ti aiuti a ottenere ciò che vuoi da log4net.


ah, il rifiuto è quello che io, personalmente, stavo cercando. vorrebbe informazioni + messaggi di errore ma non debug. grazie per questo.
Sarfaraaz,

by adding a "deny" node to the filterCome?
mrhotroad,

@mrhotroad Non sono sicuro di quanto sia diversa la versione corrente di log4net dalla versione del 2014, ma ecco il documento su LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/… Quindi puoi fare <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life il

8

È vero che la documentazione ufficiale ( Manuale di Apache log4net ™ - Introduzione ) afferma che ci sono i seguenti livelli ...

  • TUTTI
  • DEBUG
  • INFORMAZIONI
  • AVVISARE
  • ERRORE
  • FATALE
  • OFF

... ma stranamente quando visualizzo assembly log4net.dll, v1.2.15.0 classe sigillata log4net.Core.Level vedo i seguenti livelli definiti ...

public static readonly Level Alert;
public static readonly Level All;
public static readonly Level Critical;
public static readonly Level Debug;
public static readonly Level Emergency;
public static readonly Level Error;
public static readonly Level Fatal;
public static readonly Level Fine;
public static readonly Level Finer;
public static readonly Level Finest;
public static readonly Level Info;
public static readonly Level Log4Net_Debug;
public static readonly Level Notice;
public static readonly Level Off;
public static readonly Level Severe;
public static readonly Level Trace;
public static readonly Level Verbose;
public static readonly Level Warn;

Sto usando TRACE insieme a PostSharp OnBoundaryEntry e OnBoundaryExit da molto tempo. Mi chiedo perché questi altri livelli non siano nella documentazione. Inoltre, qual è la vera priorità di tutti questi livelli?


2
Per quello che vale, sono tutti elencati al seguente link, ma non hanno aggiornato i loro manuali da un po 'di tempo. logging.apache.org/log4net/release/sdk/html/...
Dinerdo

2
Livello Fine; Livello più fine; Livello più fine; Da ora in poi userò questi tre.
maembe

-3

Prova in questo modo, ha funzionato per me

<root>
  <!--<level value="ALL" />-->
  <level value="ERROR" />
  <level value="INFO" />
  <level value="WARN" />     
</root>

In questo modo vengono registrati 3 tipi di errori: errore, informazioni e avviso


7
Secondo i documenti log4net per Root Logger: "livello: elemento facoltativo, massimo uno consentito . Definisce il livello di registrazione per questo logger. Questo logger accetterà solo eventi a questo livello o superiore. "
gonadarian,

Perché questa risposta ha dato un voto negativo? Funziona anche per me. Da qui il voto.
amilamad,

1
Perché <level value = "WARN" /> sarebbe stato sufficiente.
rlesias,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.