log4net-Hierarchie und Protokollierungsebenen

127

Diese Seite sagt

Loggern können Ebenen zugewiesen werden. Ebenen sind Instanzen der Klasse log4net.Core.Level. Die folgenden Ebenen werden in der Reihenfolge zunehmender Priorität definiert :

  • ALLES
  • DEBUGGEN
  • DIE INFO
  • WARNEN
  • ERROR
  • TÖDLICH
  • AUS

DEBUG scheint die niedrigste Priorität zu haben und ERROR ist höher.

Frage

  • Wenn ich das Min- und Max-Beispiel DEBUG und ERROR setze, werden alle DEBUG, INFO, WARN und ERROR gedruckt. Ohne Verwendung von Min- und Max-Filter. Wenn ich ERROR (Logging Level = ERROR) spezifiziere, enthält es DEBUG, INFO & WARN
 <filter type="log4net.Filter.LevelRangeFilter">
     <param name="LevelMin" value="ERROR"/>
     <param name="LevelMax" value="ERROR"/>
 </filter>

Anstelle von Min- und Max-Filter. Ist es möglich, eine Ebene zu konfigurieren und alle anderen darunter liegenden Ebenen für die Protokollierung einzuschließen?

Beispiel - Pegel als Fehler einstellen, der DEBUG, INFO, WARN und ERROR enthält. Ist das mit log4net möglich?

Veröffentlichung der log4net-Konfiguration basierend auf einem der folgenden Kommentare:

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

Siva
quelle
Haben Sie versucht, die Protokollierungsstufe auf INFO zu setzen, und überprüft, ob INFO und DEBUG enthalten sind?
Standard
5
DEBUG scheint die niedrigste Priorität zu haben und Fehler ist die höchste. Dies ist keine Priorität , sondern ein Schwellenwert über oder über einer Nachricht wird protokolliert.
R. Schreurs
Haben Sie versucht, nur mit levelMax? Ich denke, dass das alles darunter enthalten sollte, wenn Sie nicht einlevelMin
AN

Antworten:

90

Dies kann helfen, zu verstehen, was auf welcher Ebene aufgezeichnet wird. Loggern können Ebenen zugewiesen werden. Ebenen sind Instanzen der Klasse log4net.Core.Level. Die folgenden Ebenen werden in der Reihenfolge des zunehmenden Schweregrads definiert - Protokollstufe.

Anzahl der für jede Einstellungsstufe aufgezeichneten Ebenen:

 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
Mel Pama
quelle
2
Entschuldigung, ich dachte das wäre wswg, warum ist es nicht?
Mel Pama
1
Sie können einen Blick auf diesen Teil der Website für die richtige Formatierung der Antworten werfen
Jarod Moser
36

Für die meisten Anwendungen möchten Sie eine minimale, aber keine maximale Stufe festlegen.

Wenn Sie beispielsweise Ihren Code debuggen, setzen Sie die Mindeststufe auf DEBUG und in der Produktion auf WARN.

Ilya Kogan
quelle
Bitte überprüfen Sie meine aktualisierte Frage, Meine Frage ist für Ebenen und Protokoll Anweisungen
Siva
Wechseln Sie <level value="ALL" /> in <level value="WARN" />und Sie erhalten nur die Warnungen und Fehler.
Ilya Kogan
2
Nein, es hilft nicht. Ich habe versucht mich zu ändern. Ich habe keine Protokolle für unter Priorität gesehen
Siva
12
Natürlich werden die Protokolle nicht unter der Priorität angezeigt. Das ist eine Mindestpriorität, die Sie festlegen.
Ilya Kogan
19

DEBUG zeigt alle Nachrichten an, INFO alle außer DEBUG-Nachrichten und so weiter.
Normalerweise verwendet man entweder INFO oder WARN. Dies hängt von der Unternehmensrichtlinie ab.

weismat
quelle
Bitte überprüfen Sie meine aktualisierte Frage, Meine Frage ist für Ebenen und Protokollanweisungen
Siva
Bitte posten Sie Ihre gesamte log4Net-Konfiguration. Möglicherweise haben Sie zwei störende Logger.
Weismat
Und ich persönlich habe bisher nur die Pegeleinstellung verwendet. Ich denke, Min / Max-Einstellungen sollten nach Möglichkeit vermieden werden.
Weismat
Ich habe die gesamte log4net-Konfiguration gepostet. Bitte prüfen. Ich versuche zu lernen und umzusetzen.
Siva
16

Hier ist ein Code, der die Priorität aller log4net-Ebenen angibt:

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

Mohamed-ali MAAMAR
quelle
10

Wie andere angemerkt haben, ist es normalerweise vorzuziehen, eine Mindestprotokollierungsstufe anzugeben, um diese Stufe und alle anderen schwerwiegenderen als diese zu protokollieren. Es scheint, als würden Sie nur rückwärts über die Protokollierungsstufen nachdenken.

Wenn Sie jedoch eine genauere Kontrolle über die Protokollierung einzelner Ebenen wünschen, können Sie log4net anweisen, nur eine oder mehrere bestimmte Ebenen mithilfe der folgenden Syntax zu protokollieren:

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

Oder um eine bestimmte Protokollierungsstufe auszuschließen, indem Sie dem Filter einen "Verweigern" -Knoten hinzufügen.

Sie können mehrere Filter zusammen stapeln, um mehrere Ebenen anzugeben. Zum Beispiel, wenn Sie nur die Ebenen WARN und FATAL möchten. Wenn die gewünschten Ebenen aufeinanderfolgend waren, ist der LevelRangeFilter besser geeignet.

Referenzdokument: log4net.Filter.LevelMatchFilter

Wenn die anderen Antworten Ihnen nicht genügend Informationen gegeben haben, hilft Ihnen dies hoffentlich dabei, das zu erreichen, was Sie von log4net erwarten.

ulty4life
quelle
Ah, die Ablehnung ist das, wonach ich persönlich gesucht habe. möchte info + fehlermeldungen aber nicht debuggen. Danke dafür.
Sarfaraaz
by adding a "deny" node to the filterWie?
Mrhotroad
@mrhotroad Ich bin mir nicht sicher, wie unterschiedlich die aktuelle Version von log4net von der Version im Jahr 2014 ist, aber hier ist das Dokument auf LevelMatchFilter.AcceptOnMatch. logging.apache.org/log4net/release/sdk/html/… So können Sie <levelToMatch value = "WARN" AcceptOnMatch = "false" />
ulty4life
8

Die offizielle Dokumentation ( Apache log4net ™ Handbuch - Einführung ) besagt, dass es die folgenden Ebenen gibt ...

  • ALLES
  • DEBUGGEN
  • DIE INFO
  • WARNEN
  • ERROR
  • TÖDLICH
  • AUS

... aber seltsamerweise sehe ich beim Anzeigen der Assembly log4net.dll, v1.2.15.0 versiegelte Klasse log4net.Core.Level die folgenden definierten Ebenen ...

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;

Ich benutze TRACE seit langer Zeit in Verbindung mit PostSharp OnBoundaryEntry und OnBoundaryExit. Ich frage mich, warum diese anderen Ebenen nicht in der Dokumentation enthalten sind. Was ist darüber hinaus die wahre Priorität all dieser Ebenen?

Barrypicker
quelle
2
Für das, was es wert ist, sind sie alle unter dem folgenden Link aufgeführt, aber sie haben ihre Handbücher anscheinend eine Weile nicht aktualisiert. logging.apache.org/log4net/release/sdk/html/…
Dinerdo
2
Level Fein; Level Finer; Level Finest; Ich werde diese drei von jetzt an nur noch verwenden.
Maembe
-3

Versuchen Sie es so, es hat bei mir funktioniert

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

Dies protokolliert 3 Arten von Fehlern - Fehler, Informationen und Warnungen

Dhananjay
quelle
7
Laut log4net-Dokumenten für Root Logger: "Ebene: Optionales Element, maximal eins zulässig . Definiert die Protokollierungsstufe für diesen Logger. Dieser Logger akzeptiert nur Ereignisse, die auf dieser Ebene oder höher liegen. "
Gonadarian
Warum hat diese Antwort die Abstimmung abgelehnt? Es funktioniert auch für mich. Daher bis zur Abstimmung.
Amilamad
1
Weil <level value = "WARN" /> ausgereicht hätte.
Rlesias