Wann werden die verschiedenen Protokollebenen verwendet?


520

Es gibt verschiedene Möglichkeiten, Nachrichten in der Reihenfolge ihres Todes zu protokollieren:

  1. FATAL

  2. ERROR

  3. WARN

  4. INFO

  5. DEBUG

  6. TRACE

Wie entscheide ich, wann ich welche verwenden soll?

Was ist eine gute Heuristik?


11
Ganz breite Frage. Abhängig von den tatsächlichen Umständen der Protokollierung ist also mehr als eine Antwort möglich. Jemand wird noticein dieser Sammlung vermissen, jemand wird nicht ...
Wolf

@ Wolf wo würde "bemerken" unter diese Hierarchie fallen? Nur für die Aufzeichnung ...
pgblu

1
noticeMöglicherweise fehlt es, weil einige beliebte Protokollierungsdienste wie log4j es nicht verwenden.
pgblu

Antworten:


750

Ich unterschreibe im Allgemeinen die folgende Konvention:

  • Trace - Nur wenn ich den Code "verfolgen" und versuchen würde, einen Teil einer Funktion spezifisch zu finden.
  • Debug - Informationen, die nicht nur für Entwickler (IT, Systemadministratoren usw.) diagnostisch hilfreich sind.
  • Info - Allgemein nützliche Informationen zum Protokollieren (Start / Stopp des Dienstes, Konfigurationsannahmen usw.). Info Ich möchte immer verfügbar sein, kümmere mich aber normalerweise nicht um normale Umstände. Dies ist meine sofort einsatzbereite Konfigurationsstufe.
  • Warnen - Alles, was möglicherweise zu Anwendungsfehlern führen kann, für das ich mich jedoch automatisch erholt habe. (B. Wechsel von einem primären zu einem Sicherungsserver, Wiederholung eines Vorgangs, fehlende sekundäre Daten usw.)
  • Fehler - Jeder Fehler, der für den Vorgang schwerwiegend ist , jedoch nicht für den Dienst oder die Anwendung (eine erforderliche Datei, fehlende Daten usw. können nicht geöffnet werden). Diese Fehler erzwingen Eingriffe des Benutzers (Administrator oder direkter Benutzer). Diese sind normalerweise (in meinen Apps) für falsche Verbindungszeichenfolgen, fehlende Dienste usw. reserviert.
  • Schwerwiegend - Jeder Fehler, der das Herunterfahren des Dienstes oder der Anwendung erzwingt, um Datenverlust (oder weiteren Datenverlust) zu verhindern. Ich behalte mir diese nur für die abscheulichsten Fehler und Situationen vor, in denen garantiert Daten beschädigt oder verloren gegangen sind.

2
Warum kannst du keine Informationen zusammenführen und warnen! ??! Ist keine Warnung über etwas tatsächlich "Info" ...
mP.

35
@mP Sie könnten Informationen zusammenführen und warnen, ich denke, im Allgemeinen sind sie aufgrund des "Panik" -Prinzips getrennt. Wenn ich eine Reihe von Informationen habe, die Routine sind und nur den Status auflisten, lohnt es sich nicht, "zuerst" zu schauen, aber wenn es Unmengen von "Warnungen" gibt, möchte ich diese priorisiert sehen (nach Fehlern und Fatals), damit ich sie untersuchen kann Sie. Ich würde bei vielen Warnungen mehr in Panik geraten als bei vielen Info-Nachrichten.
GrayWizardx

3
@dzieciou es hängt von Ihren besonderen Bedürfnissen ab. Manchmal kann es tödlich sein, manchmal eine Warnung. Wenn ich von einem kritischen Dienst, auf den ich angewiesen bin und den ich nicht fortsetzen kann, einen 4xx erhalten würde, wäre dies ein Fehler / schwerwiegend für meine Entwürfe. Wenn ich versuchen würde, einige Daten für die spätere Verwendung zwischenzuspeichern, aber ohne sie leben könnte, wäre dies eine Warnung. Das einzige Mal, wenn ich sehe, dass es sich um Informationen handelt, handelt es sich um eine Überwachungs-App, die den Status ihrer URL-Überprüfungen meldet. Also würde ich INFO protokollieren, dass ich ein 4xx von der URL bekommen habe und weitermachen.
GrayWizardx

2
@GrayWizardx, ich denke, der andere Faktor ist, ob dies der Client ist, der 4xx empfangen hat, oder der Server, der es gesendet hat. Im ersten Fall wäre ich eher bereit, ERROR zu verwenden (OMG, es ist meine Schuld, dass ich keine richtige Anfrage vorbereiten kann), während ich im letzteren Fall WARN protokollieren würde (es ist die Schuld der Kunden, dass sie Anfragen nicht richtig formulieren können)
dzieciou

4
Ich vermute, das ist wahr - Debug - Information that is diagnostically helpful to people more than just developers (IT, sysadmins, etc.).. Logger.Debug ist nur für Entwickler, um sehr schlimme Probleme in der Produktion aufzuspüren, z. B.If you want to print the value of a variable at any given point inside a for loop against a condition
RBT

303

Möchten Sie, dass die Nachricht einen Systemadministrator mitten in der Nacht aus dem Bett bringt?

  • ja -> fehler
  • nein -> warnen

11
Außer den meisten Menschen ist es egal, ob sie nachts Menschen aus dem Bett holen. Wir haben Kunden veranlasst, Dockets mit Schweregrad 1 zu erheben (für 100% Ausfall, dh national), weil eine Site ihre Arbeit nicht ausführen konnte (ihre Argumentation war, dass es 100% dieser Site ist). Wir haben sie seitdem in dieser Hinsicht "erzogen".
Paxdiablo

53
FATALWenn der Systemadministrator aufwacht, entscheidet er, dass er dafür nicht genug bezahlt hat, und schläft wieder ein.
Mateen Ulhaq

134

Ich finde es hilfreicher, über Schweregrade aus der Perspektive der Anzeige der Protokolldatei nachzudenken.

Schwerwiegend / kritisch : Gesamtanwendung oder Systemfehler, die sofort untersucht werden sollten. Ja, wecken Sie den SysAdmin auf. Da wir unseren SysAdmins-Alarm bevorzugen und ausgeruht sind, sollte dieser Schweregrad sehr selten verwendet werden. Wenn es täglich passiert und das kein BFD ist, hat es seine Bedeutung verloren. In der Regel tritt ein schwerwiegender Fehler nur einmal in der Prozesslebensdauer auf. Wenn die Protokolldatei an den Prozess gebunden ist, ist dies normalerweise die letzte Meldung im Protokoll.

Fehler : Auf jeden Fall ein Problem, das untersucht werden sollte. SysAdmin sollte automatisch benachrichtigt werden, muss aber nicht aus dem Bett gezogen werden. Durch Filtern eines Protokolls nach Fehlern und höher erhalten Sie einen Überblick über die Fehlerhäufigkeit und können schnell den auslösenden Fehler identifizieren, der möglicherweise zu einer Kaskade zusätzlicher Fehler geführt hat. Das Verfolgen von Fehlerraten im Vergleich zur Anwendungsnutzung kann nützliche Qualitätsmetriken wie MTBF ergeben, anhand derer die Gesamtqualität bewertet werden kann. Diese Metrik kann beispielsweise dazu beitragen, Entscheidungen darüber zu treffen, ob vor einer Veröffentlichung ein weiterer Beta-Testzyklus erforderlich ist oder nicht.

Warnung : Dies könnte ein Problem sein oder auch nicht. Beispielsweise sollten erwartete vorübergehende Umgebungsbedingungen wie ein kurzer Verlust der Netzwerk- oder Datenbankkonnektivität als Warnungen und nicht als Fehler protokolliert werden. Das Anzeigen eines Protokolls, das so gefiltert wird, dass nur Warnungen und Fehler angezeigt werden, gibt möglicherweise einen schnellen Einblick in frühe Hinweise auf die Grundursache eines nachfolgenden Fehlers. Warnungen sollten sparsam verwendet werden, damit sie nicht bedeutungslos werden. Der Verlust des Netzwerkzugriffs sollte beispielsweise eine Warnung oder sogar ein Fehler in einer Serveranwendung sein, kann jedoch nur eine Information in einer Desktop-App sein, die für gelegentlich getrennte Laptop-Benutzer entwickelt wurde.

Info : Dies sind wichtige Informationen, die unter normalen Bedingungen protokolliert werden sollten, z. B. erfolgreiche Initialisierung, Starten und Stoppen von Diensten oder erfolgreicher Abschluss wichtiger Transaktionen. Das Anzeigen eines Protokolls mit Informationen und höher sollte einen schnellen Überblick über wichtige Statusänderungen im Prozess geben und einen Kontext auf oberster Ebene bieten, um eventuell auftretende Warnungen oder Fehler zu verstehen. Haben Sie nicht zu viele Info-Nachrichten. Wir haben normalerweise <5% Info-Nachrichten in Bezug auf Trace.

Trace : Trace ist bei weitem der am häufigsten verwendete Schweregrad und sollte einen Kontext bieten, um die Schritte zu verstehen, die zu Fehlern und Warnungen führen. Die richtige Dichte an Trace-Nachrichten macht Software viel wartbarer, erfordert jedoch einige Sorgfalt, da sich der Wert einzelner Trace-Anweisungen im Laufe der Zeit ändern kann, wenn sich Programme weiterentwickeln. Der beste Weg, dies zu erreichen, besteht darin, das Entwicklerteam daran zu gewöhnen, Protokolle regelmäßig zu überprüfen, um die vom Kunden gemeldeten Probleme zu beheben. Ermutigen Sie das Team, Trace-Nachrichten zu entfernen, die keinen nützlichen Kontext mehr bieten, und bei Bedarf Nachrichten hinzuzufügen, um den Kontext nachfolgender Nachrichten zu verstehen. Beispielsweise ist es häufig hilfreich, Benutzereingaben zu protokollieren, z. B. das Ändern von Anzeigen oder Registerkarten.

Debug : Wir betrachten Debug <Trace. Der Unterschied besteht darin, dass Debug-Nachrichten aus Release-Builds kompiliert werden. Wir raten jedoch von der Verwendung von Debug-Nachrichten ab. Das Zulassen von Debug-Nachrichten führt dazu, dass immer mehr Debug-Nachrichten hinzugefügt und keine jemals entfernt werden. Mit der Zeit werden Protokolldateien dadurch fast unbrauchbar, da es zu schwierig ist, Signale von Rauschen zu filtern. Dies führt dazu, dass Entwickler die Protokolle nicht verwenden, was die Todesspirale fortsetzt. Im Gegensatz dazu ermutigt das ständige Beschneiden von Trace-Nachrichten Entwickler, diese zu verwenden, was zu einer tugendhaften Spirale führt. Dadurch wird auch die Möglichkeit von Fehlern ausgeschlossen, die aufgrund der erforderlichen Nebenwirkungen im Debug-Code auftreten, die nicht im Release-Build enthalten sind. Ja, ich weiß, dass das in gutem Code nicht passieren sollte, aber besser sicher als leid.


2
Ich mag es, dass es betont, über das Publikum nachzudenken. Der Schlüssel bei jeder Kommunikation (und Protokollnachrichten sind eine Form der Kommunikation) besteht darin, über Ihr Publikum und dessen Bedürfnisse nachzudenken.
Sleske

18
Informationen zum Debuggen <-> Trace: Beachten Sie, dass zumindest in Java-Land die Prioritätsreihenfolge "Debug> Trace" lautet. Dies ist die Konvention, die alle mir bekannten Protokollierungsframeworks verwenden (SLF4J, Logback, log4j, Apache Commons-Protokollierung, Log4Net, NLog). Debug <Trace erscheint mir also ungewöhnlich.
Sleske

1
@ Jay Cincotta Tolle Antwort. Ich denke, Debug / Trace ist eine Frage der Präferenz, aber diese Art von Details sind sicherlich eher app- / firmenspezifisch, so dass es gut ist, unterschiedliche Meinungen zu sehen.
GrayWizardx

5
Ich habe gerade eine Umfrage unter 7 Protokollierungsframeworks in mehreren Sprachen durchgeführt. Von den drei, die einen Schweregrad "Trace" enthalten, ist dieser bei allen weniger schwerwiegend als beim Debuggen. dh trace <debug; Ich habe keine realen Fälle, in denen das Gegenteil der Fall ist. @RBT Es ist nicht immer möglich, in einen Debugger einzubrechen. Beispielsweise müssen Webserver Anforderungen in einer begrenzten Zeitspanne bearbeiten oder in Multithread- und / oder Serverumgebungen vorhanden sein, die möglicherweise schwer zu instrumentieren sind, oder der Fehler kann selten genug sein, dass ein Debugger keine Option ist. Oder Sie wissen nicht, wonach Sie suchen.
Thanatos

5
@RBT Ich arbeite seit über 4 Jahren mit Java-Systemen. Ich kann Ihnen sagen, dass das, was Sie fragen, völlig unpraktisch ist. IDE-Debugging kann Sie nur so weit bringen. Ab einem bestimmten Punkt benötigen Sie lediglich Debug-Protokolle von einem anderen System (häufig einem Produktionsserver ), um zu verstehen, was vor sich geht, und um den Fehler zu beheben. Sie denken vielleicht, dass es in Ihrer lokalen IDE reproduzierbar sein sollte, aber wenn Sie mit realen Systemen arbeiten, werden Sie feststellen, dass häufig viele Fehler nur auf dem Produktionsserver auftreten.
ADTC

30

Hier ist eine Liste der "Logger".


Apache log4j: §1 , §2

  1. FATAL::

    [ v1.2 : ..] sehr schwerwiegende Fehlerereignisse, die vermutlich zum Abbruch der Anwendung führen.

    [ v2.0 : ..] schwerwiegender Fehler, der die Fortsetzung der Anwendung verhindert.

  2. ERROR::

    [ v1.2 : ..] Fehlerereignisse, bei denen die Anwendung möglicherweise weiterhin ausgeführt werden kann.

    [ v2.0 : ..] Fehler in der Anwendung, möglicherweise behebbar.

  3. WARN::

    [ v1.2 : ..] potenziell schädliche Situationen.

    [ V2.0 : ..] Fall , dass Macht möglich [ sic ] zu einem Fehler führen.

  4. INFO::

    [ v1.2 : ..] Informationsmeldungen, die den Fortschritt der Anwendung auf grobkörniger Ebene hervorheben.

    [ v2.0 : ..] Ereignis zu Informationszwecken.

  5. DEBUG::

    [ v1.2 : ..] feinkörnige Informationsereignisse, die zum Debuggen einer Anwendung am nützlichsten sind.

    [ v2.0 : ..] allgemeines Debugging-Ereignis.

  6. TRACE::

    [ v1.2 : ..] feinkörnigere Informationsereignisse als die DEBUG.

    [ v2.0 : ..] feinkörnige Debug-Nachricht, die normalerweise den Fluss durch die Anwendung erfasst.


Apache Httpd (wie immer) macht gerne den Overkill: §

  1. emerg :

    Notfälle - System ist unbrauchbar.

  2. Warnung :

    Es müssen sofort Maßnahmen ergriffen werden [das System ist jedoch weiterhin verwendbar].

  3. krit :

    Kritische Bedingungen [aber es müssen nicht sofort Maßnahmen ergriffen werden].

    • " Socket: Fehler beim Abrufen eines Sockets beim Verlassen des Kindes "
  4. Fehler :

    Fehlerbedingungen [aber nicht kritisch].

    • " Vorzeitiges Ende der Skript-Header "
  5. warnen :

    Warnbedingungen. [nah am Fehler, aber kein Fehler]

  6. Hinweis :

    Normaler, aber signifikanter [ bemerkenswerter ] Zustand.

    • " httpd: gefangen SIGBUS, versucht den Kern in ... "
  7. info :

    Informativ [und nicht kommentierbar].

    • [" Server läuft seit x Stunden. "]
  8. Debug :

    Nachrichten auf Debug-Ebene [dh Nachrichten, die zum Zwecke der Fehlerbehebung protokolliert wurden ]].

    • " Konfigurationsdatei öffnen ... "
  9. trace1trace6 :

    Nachrichten verfolgen [dh Nachrichten, die zum Zwecke der Verfolgung protokolliert wurden ].

    • " Proxy: FTP: Steuerverbindung abgeschlossen "
    • " Proxy: CONNECT: Senden der CONNECT-Anforderung an den Remote-Proxy "
    • " openssl: Handshake: start "
    • " Lesen von gepufferter SSL-Brigade, Modus 0, 17 Bytes "
    • " Kartensuche fehlgeschlagen:map=rewritemap key=keyname "
    • " Cache-Suche fehlgeschlagen, erzwingt neue Kartensuche "
  10. trace7trace8 :

    Verfolgen Sie Nachrichten und sichern Sie große Datenmengen

    • " | 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
    • " | 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"

Apache Commons-Logging: §

  1. tödlich :

    Schwere Fehler, die zu einer vorzeitigen Beendigung führen. Erwarten Sie, dass diese auf einer Statuskonsole sofort sichtbar sind.

  2. Fehler :

    Andere Laufzeitfehler oder unerwartete Bedingungen. Erwarten Sie, dass diese auf einer Statuskonsole sofort sichtbar sind.

  3. warnen :

    Verwendung veralteter APIs, schlechte Verwendung der API, "fast" Fehler, andere Laufzeitsituationen, die unerwünscht oder unerwartet sind, aber nicht unbedingt "falsch". Erwarten Sie, dass diese auf einer Statuskonsole sofort sichtbar sind.

  4. info :

    Interessante Laufzeitereignisse (Start / Herunterfahren). Erwarten Sie, dass diese auf einer Konsole sofort sichtbar sind. Seien Sie also konservativ und halten Sie sich auf ein Minimum.

  5. Debug :

    detaillierte Informationen zum Durchfluss durch das System. Erwarten Sie, dass diese nur in Protokolle geschrieben werden.

  6. Spur :

    detailliertere Informationen. Erwarten Sie, dass diese nur in Protokolle geschrieben werden.

Apache Commons-Logging "Best Practices" für den Unternehmensgebrauch unterscheidet zwischen Debug und Informationen basierend darauf, welche Art von Grenzen sie überschreiten.

Grenzen umfassen:

  • Externe Grenzen - Erwartete Ausnahmen.

  • Externe Grenzen - Unerwartete Ausnahmen.

  • Interne Grenzen.

  • Wichtige interne Grenzen.

( Weitere Informationen hierzu finden Sie im Commons-Logging-Handbuch .)


24

Wenn Sie das Problem beheben können, ist dies eine Warnung. Wenn dies die weitere Ausführung verhindert, liegt ein Fehler vor.


5
Aber was ist dann der Unterschied zwischen Fehler und schwerwiegendem Fehler?
user192472

37
Ein Fehler ist etwas, das Sie tun (z. B. eine nicht vorhandene Datei lesen), ein schwerwiegender Fehler ist etwas, das Ihnen angetan wird (z. B. nicht genügend Speicher).
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Ich mag deine Art zu unterscheiden. Aber worauf basiert Ihr Kommentar? AFIAK unter iOS-Entwicklern ist es üblich, eine Zusicherung zu schreiben, die sich darauf bezieht, fatalErrorwann eine Datei nicht existiert. Im Grunde ist es das Gegenteil von dem, was Sie gesagt haben.
Honig

@Honey: In einer mobilen Situation ist es sinnvoll, eine fehlende Datei als schwerwiegenden Fehler zu betrachten.
Ignacio Vazquez-Abrams

23

Ich würde empfehlen, Syslog-Schweregrade zu übernehmen : DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY.
Siehe http://en.wikipedia.org/wiki/Syslog#Severity_levels

Sie sollten für die meisten Anwendungsfälle genügend feinkörnige Schweregrade bereitstellen und werden von vorhandenen Protokollparsern erkannt. Sie haben natürlich die Freiheit, nur eine Teilmenge zu implementieren, z. B. DEBUG, ERROR, EMERGENCYabhängig von den Anforderungen Ihrer App.

Lassen Sie uns auf etwas standardisieren, das es schon seit Ewigkeiten gibt, anstatt für jede andere App, die wir erstellen, einen eigenen Standard zu entwickeln. Sobald Sie mit dem Aggregieren von Protokollen beginnen und versuchen, Muster über verschiedene hinweg zu erkennen, hilft dies wirklich.


1
Ich benötige ein Ablaufverfolgungsprotokoll, um zu sehen, wie die Dinge in meinem Code ausgeführt werden. Was unternimmt Syslog, um dies zu beheben?
K - Die Toxizität in SO nimmt zu.

Traces möchten Sie normalerweise nicht über Syslog übertragen, und ich denke, Sie können diese Ebene für Ihre eigenen interaktiven Debugging-Sitzungen hinzufügen.
kvz

2
All diese erweiterten Ebenen erhöhen die Komplexität der Protokollierung von IMO. Es ist am besten, sich an das einfachste Set zu halten, das den spezifischen Anforderungen der App entspricht. Für mich, sollten Sie beginnen mit DEBUG, INFO, WARNINGund ERROR. Entwickler sollten alle Ebenen sehen. SysAdmins bis INFOund Endbenutzer können Warnungen und Fehler sehen, jedoch nur, wenn ein Framework vorhanden ist, um sie darauf aufmerksam zu machen .
ADTC

1
(Fortsetzung) Wenn die App ausgereift ist , können Sie sie bei Bedarf auf weitere Ebenen erweitern. Wie beide DEBUGund TRACEfür Entwickler, um die Granularität zu steuern. Und ERRORerweitert auf andere Ebenen wie CRITICAL, ALERT, EMERGENCYdie Schwere von Fehlern zu unterscheiden und bestimmen die Aktion basierend auf der Schwere.
ADTC

17

Warnungen, von denen Sie sich erholen können. Fehler, die Sie nicht können. Das ist meine Heuristik, andere haben vielleicht andere Ideen.

Angenommen, Sie geben den Namen "Angela Müller"in Ihre Anwendung ein / importieren ihn (beachten Sie den Umlaut über u). Ihr Code / Ihre Datenbank ist möglicherweise nur englisch (obwohl dies heutzutage wahrscheinlich nicht mehr der Fall sein sollte ) und könnte daher warnen, dass alle "ungewöhnlichen" Zeichen in reguläre englische Zeichen konvertiert wurden.

Vergleichen Sie dies mit dem Versuch, diese Informationen in die Datenbank zu schreiben und 60 Sekunden lang eine Nachricht über einen Netzwerkausfall zu erhalten. Das ist eher ein Fehler als eine Warnung.


Befindet sich die Datenbank in einem bestimmten Zeichensatz, der den Umlaut nicht enthält, muss diese Eingabe abgelehnt werden.
Cochise Ruhulessin

Cochise, die Welt ist selten so schwarz und weiß :-)
paxdiablo

6

Wie andere gesagt haben, sind Fehler Probleme; Warnungen sind mögliche Probleme.

In der Entwicklung verwende ich häufig Warnungen, bei denen ich möglicherweise das Äquivalent eines Assertionsfehlers setze, die Anwendung jedoch weiterarbeiten kann. Auf diese Weise kann ich herausfinden, ob dieser Fall jemals tatsächlich eintritt oder ob es meine Vorstellungskraft ist.

Aber ja, es kommt auf die Aspekte der Wiederherstellbarkeit und Aktualität an. Wenn Sie sich erholen können, ist dies wahrscheinlich eine Warnung. Wenn dadurch tatsächlich etwas fehlschlägt, liegt ein Fehler vor.


5

Ich denke, dass die SYSLOG-Ebenen NOTICE und ALERT / EMERGENCY für die Protokollierung auf Anwendungsebene weitgehend überflüssig sind - während CRITICAL / ALERT / EMERGENCY nützliche Warnstufen für einen Bediener sein können, der unterschiedliche Aktionen und Benachrichtigungen auslösen kann TÖDLICH. Und ich kann einfach nicht ausreichend zwischen einer Kündigung oder einer Information unterscheiden. Wenn die Informationen nicht bemerkenswert sind, sind es nicht wirklich Informationen :)

Die Interpretation von Jay Cincotta gefällt mir am besten - das Nachverfolgen der Ausführung Ihres Codes ist im technischen Support sehr nützlich, und das großzügige Einfügen von Trace-Anweisungen in den Code sollte empfohlen werden - insbesondere in Kombination mit einem dynamischen Filtermechanismus zum Protokollieren der Trace-Nachrichten von bestimmten Anwendungskomponenten. Die DEBUG-Ebene bedeutet für mich jedoch, dass wir noch dabei sind, herauszufinden, was los ist. Ich sehe die Ausgabe der DEBUG-Ebene als reine Entwicklungsoption und nicht als etwas, das jemals in einem Produktionsprotokoll angezeigt werden sollte.

Es gibt jedoch eine Protokollierungsstufe, die ich gerne in meinen Fehlerprotokollen sehe, wenn ich den Hut eines Systemadministrators trage, genauso wie den des technischen Supports oder sogar des Entwicklers: OPER für OPERATIONAL-Nachrichten. Dies verwende ich zum Protokollieren eines Zeitstempels, der Art der aufgerufenen Operation, der angegebenen Argumente, möglicherweise einer (eindeutigen) Aufgabenkennung und der Aufgabenerfüllung. Es wird verwendet, wenn z. B. eine eigenständige Aufgabe ausgelöst wird. Dies ist ein echter Aufruf innerhalb der größeren App mit langer Laufzeit. Es ist die Art von Dingen, die ich immer protokollieren möchte, egal ob etwas schief geht oder nicht. Daher halte ich den OPER-Level für höher als FATAL, sodass Sie ihn nur ausschalten können, indem Sie in den völlig stillen Modus wechseln. Und es ist viel mehr als nur INFO-Protokolldaten - eine Protokollebene, die häufig zum Spammen von Protokollen mit geringfügigen Betriebsmeldungen ohne historischen Wert missbraucht wird.

Wie es der Fall vorschreibt, können diese Informationen an ein separates Aufrufprotokoll weitergeleitet oder durch Herausfiltern aus einem großen Protokoll, in dem weitere Informationen aufgezeichnet werden, abgerufen werden. Als historische Information muss man jedoch immer wissen, was getan wurde - ohne auf die Ebene von AUDIT abzusteigen, eine andere völlig separate Protokollebene, die nichts mit Fehlfunktionen oder Systembetrieb zu tun hat, passt nicht wirklich in die oben genannten Ebenen ( da es einen eigenen Steuerschalter benötigt, keine Schweregradklassifizierung) und definitiv eine eigene separate Protokolldatei benötigt.


5

Ab RFC 5424 das Syslog-Protokoll (IETF) - Seite 10:

Jede Nachrichtenpriorität hat auch eine dezimale Schweregradanzeige. Diese werden in der folgenden Tabelle zusammen mit ihren numerischen Werten beschrieben. Schweregrade MÜSSEN im Bereich von 0 bis einschließlich 7 liegen.

       Numerical         Severity
         Code

          0       Emergency: system is unusable
          1       Alert: action must be taken immediately
          2       Critical: critical conditions
          3       Error: error conditions
          4       Warning: warning conditions
          5       Notice: normal but significant condition
          6       Informational: informational messages
          7       Debug: debug-level messages

          Table 2. Syslog Message Severities

4

Tag auch,

Als Folge dieser Frage teilen Sie Ihre Interpretationen der Protokollebenen mit und stellen Sie sicher, dass alle Personen in einem Projekt in ihrer Interpretation der Ebenen ausgerichtet sind.

Es ist schmerzhaft, eine Vielzahl von Protokollnachrichten zu sehen, bei denen die Schweregrade und die ausgewählten Protokollstufen inkonsistent sind.

Geben Sie nach Möglichkeit Beispiele für die verschiedenen Protokollierungsstufen an. Und seien Sie konsistent in den Informationen, die in einer Nachricht protokolliert werden sollen.

HTH


4

Ich stimme den anderen voll und ganz zu und denke, dass GrayWizardx es am besten gesagt hat.

Alles, was ich hinzufügen kann, ist, dass diese Ebenen im Allgemeinen ihren Wörterbuchdefinitionen entsprechen, also kann es nicht so schwer sein. Wenn Sie Zweifel haben, behandeln Sie es wie ein Puzzle. Denken Sie für Ihr spezielles Projekt an alles, was Sie protokollieren möchten.

Können Sie jetzt herausfinden, was tödlich sein könnte? Sie wissen, was tödlich bedeutet, nicht wahr? Also, welche Elemente auf Ihrer Liste sind fatal.

Ok, das ist fatal behandelt, jetzt schauen wir uns die Fehler an ... spülen und wiederholen.

Unter Fatal oder vielleicht Error würde ich vorschlagen, dass mehr Informationen immer besser sind als weniger, also irre "nach oben". Sie sind sich nicht sicher, ob es sich um Informationen oder Warnungen handelt? Dann machen Sie es eine Warnung.

Ich denke, dass Fatal und Irrtum uns allen klar sein sollten. Die anderen mögen unschärfer sein, aber es ist wohl weniger wichtig, sie richtig zu machen.

Hier sind einige Beispiele:

Schwerwiegend - Speicher, Datenbank usw. können nicht zugeordnet werden - kann nicht fortgesetzt werden.

Fehler - Keine Antwort auf Nachricht, Transaktion abgebrochen, Datei kann nicht gespeichert werden usw.

Warnung - Die Ressourcenzuweisung erreicht X% (z. B. 80%). Dies ist ein Zeichen dafür, dass Sie Ihre Ressourcen möglicherweise neu dimensionieren möchten.

Info - Benutzer angemeldet / abgemeldet, neue Transaktion, Datei erstellt, neues D / B-Feld oder Feld gelöscht.

Debug - Speicherauszug der internen Datenstruktur, Anything Trace-Ebene mit Dateiname und Zeilennummer.
Trace - Aktion erfolgreich / fehlgeschlagen, d / b aktualisiert.


3

Ein Fehler ist etwas, das falsch ist, einfach falsch, kein Weg daran vorbei, er muss behoben werden.

Eine Warnung ist ein Zeichen für ein Muster, das möglicherweise falsch ist, aber auch nicht.

Trotzdem kann ich kein gutes Beispiel für eine Warnung finden, die nicht auch ein Fehler ist. Damit meine ich, dass Sie das zugrunde liegende Problem genauso gut beheben können, wenn Sie sich die Mühe machen, eine Warnung zu protokollieren.

Dinge wie "SQL-Ausführung dauert zu lange" können jedoch eine Warnung sein, während "SQL-Ausführungs-Deadlocks" ein Fehler sind, sodass es vielleicht doch einige Fälle gibt.


1
Ein gutes Beispiel für eine Warnung ist, dass in MySQL standardmäßig, wenn Sie versuchen, mehr Zeichen in a einzufügen, varcharals definiert ist, Sie gewarnt werden, dass der Wert abgeschnitten wurde, ihn aber dennoch einfügt. Aber die Warnung einer Person kann der Fehler einer anderen Person sein: In meinem Fall ist dies ein Fehler; Dies bedeutet, dass ich einen Fehler in meinem Validierungscode gemacht habe, indem ich eine Länge definiert habe, die nicht mit der Datenbank übereinstimmt. Und ich wäre nicht schrecklich überrascht, wenn ein anderer DB-Motor dies als Fehler betrachten würde, und ich hätte kein wirkliches Recht, empört zu sein, schließlich ist es falsch.
Crast

Auch ich würde das als Fehler betrachten. In einigen Fällen ist der Inhalt "Text" (nicht in der Datentypbedeutung), was bedeutet, dass es möglicherweise in Ordnung ist, ihn abzuschneiden. In einem anderen Fall handelt es sich um einen Code, bei dem das Abhacken von Bits ihn beschädigt oder seine Bedeutung ändert, was nicht in Ordnung ist. Meiner Meinung nach liegt es nicht an der Software, zu erraten, was ich meinte. Wenn ich versuche, eine Zeichenfolge mit 200 Zeichen in eine Spalte mit nur 150 Zeichen zu zwingen, ist dies ein Problem, über das ich gerne Bescheid wissen würde. Ich mag jedoch die Unterscheidung, die andere hier getroffen haben: Wenn Sie sich erholen können, ist dies eine Warnung, aber dann ... müssen Sie sich anmelden?
Lasse V. Karlsen

Ein Beispiel, an das ich denken könnte, ist: Einige Nachrichten brauchen überraschend länger als gewöhnlich, um sie zu verarbeiten. Dies kann ein Hinweis darauf sein, dass etwas nicht stimmt (möglicherweise ist ein anderes System überlastet oder eine externe Ressource war vorübergehend ausgefallen).
Laradda

3

Ich habe immer darüber nachgedacht, die erste Protokollebene zu warnen, was sicher bedeutet, dass ein Problem vorliegt (z. B. ist eine Konfigurationsdatei möglicherweise nicht dort, wo sie sein sollte, und wir müssen sie mit den Standardeinstellungen ausführen). Ein Fehler bedeutet für mich, dass das Hauptziel der Software jetzt unmöglich ist und wir versuchen werden, das System sauber herunterzufahren.


1

Ich habe vorher Systeme gebaut, die Folgendes verwenden:

  1. FEHLER - bedeutet, dass etwas ernsthaft falsch ist und dass ein bestimmter Thread / Prozess / eine bestimmte Sequenz nicht fortgesetzt werden kann. Einige Benutzer- / Administratorinterventionen sind erforderlich
  2. WARNUNG - etwas stimmt nicht, aber der Prozess kann wie zuvor fortgesetzt werden (z. B. ist ein Job in einem Satz von 100 fehlgeschlagen, der Rest kann jedoch verarbeitet werden).

In den Systemen, die ich erstellt habe, wurden Administratoren angewiesen, auf FEHLER zu reagieren. Auf der anderen Seite würden wir nach WARNHINWEISEN suchen und für jeden Fall feststellen, ob Systemänderungen, Neukonfigurationen usw. erforderlich waren.


1

Übrigens bin ich ein großer Fan davon, alles zu erfassen und die Informationen später zu filtern.

Was würde passieren, wenn Sie auf Warnungsebene erfassen und Debug-Informationen zur Warnung wünschen, die Warnung jedoch nicht neu erstellen konnten?

Erfassen Sie alles und filtern Sie später!

Dies gilt auch für eingebettete Software, es sei denn, Sie stellen fest, dass Ihr Prozessor nicht mithalten kann. In diesem Fall möchten Sie möglicherweise Ihre Ablaufverfolgung neu gestalten, um sie effizienter zu gestalten, oder die Ablaufverfolgung beeinträchtigt das Timing ( möglicherweise) Debugging durchführen ein leistungsfähigerer Prozessor, aber das eröffnet eine ganze Reihe weiterer Würmer).

Erfassen Sie alles und später filtern !!

(Übrigens: Alles erfassen ist auch gut, weil Sie damit Tools entwickeln können, die mehr als nur die Debug-Ablaufverfolgung anzeigen (ich zeichne Nachrichtensequenzdiagramme aus meinen und Histogramme der Speichernutzung. Sie bieten Ihnen auch eine Vergleichsbasis, wenn etwas schief geht Zukunft (behalten Sie alle Protokolle, ob bestanden oder nicht bestanden, und stellen Sie sicher, dass die Build-Nummer in der Protokolldatei enthalten ist)).


1

Meine zwei Cent ungefähr FATALund TRACEFehlerprotokollstufen.

ERROR ist, wenn ein Fehler (Ausnahme) auftritt.

FATAL ist eigentlich DOUBLE FAULT: Wenn während der Behandlung der Ausnahme eine Ausnahme auftritt.

Für den Webdienst ist es leicht zu verstehen.

  1. Anfrage kommen. Ereignis wird als protokolliertINFO
  2. Das System erkennt einen geringen Speicherplatz. Ereignis wird als protokolliertWARN
  3. Einige Funktionen werden aufgerufen, um die Anforderung zu verarbeiten. Während der Verarbeitung erfolgt eine Division durch Null. Ereignis wird als protokolliertERROR
  4. Der Ausnahmebehandler des Webdienstes wird aufgerufen, um die Division durch Null zu behandeln. Der Webdienst / das Framework sendet E-Mails, kann dies jedoch nicht, da der Mailingdienst jetzt offline ist. Diese zweite Ausnahme kann nicht normal behandelt werden, da der Ausnahmehandler des Webdienstes keine Ausnahme verarbeiten kann.
  5. Anderer Ausnahmebehandler aufgerufen. Ereignis wird als protokolliertFATAL

TRACEDies ist der Zeitpunkt, an dem wir den Ein- / Ausgang von Funktionen verfolgen können. Hier geht es nicht um die Protokollierung, da diese Nachricht von einem Debugger generiert werden kann und Ihr Code überhaupt nicht aufgerufen hat log. Nachrichten, die nicht aus Ihrer Anwendung stammen, werden also wie folgt markiertTRACE Ebene . Zum Beispiel führen Sie Ihre Anwendung mit ausstrace

So im Allgemeinen in Ihrem Programm tun Sie DEBUG, INFOund WARNProtokollierung. Und nur wenn Sie einen Webdienst / ein Framework schreiben, werden Sie es verwenden FATAL. Und wenn Sie eine Anwendung debuggen, erhalten Sie eine TRACEProtokollierung von dieser Art von Software.


0

Ich schlage vor, nur drei Ebenen zu verwenden

  1. Tödlich - Was die Anwendung beschädigen würde.
  2. Info - Info
  3. Debug - Weniger wichtige Informationen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.