Protokollierungsstufen - Protokollierung - Faustregel zum Zuweisen von Protokollierungsstufen


258

Ich benutze Logback in meinem aktuellen Projekt.

Es bietet sechs Protokollierungsstufen: TRACE DEBUG INFO WARN ERROR OFF

Ich suche nach einer Faustregel, um die Protokollstufe für allgemeine Aktivitäten zu bestimmen. Wenn beispielsweise ein Thread gesperrt ist, sollte die Protokollnachricht auf die Debug-Ebene oder die Info-Ebene gesetzt werden. Oder wenn ein Socket verwendet wird, sollte seine spezifische ID auf Debug- oder Trace-Ebene protokolliert werden.

Ich freue mich über Antworten mit weiteren Beispielen für jede Protokollierungsstufe.


3
Eigentlich sind diese Werte definiert durch einfache Protokollierung Fassade für Java (SLF4J) , die Reihe von Schnittstellen sollte eine Fassade vor einer Logging - Implementierung sein. Logback ist eine solche Implementierung.
Basil Bourque

Antworten:


467

Ich baue hauptsächlich große Systeme mit hoher Verfügbarkeit, daher ist meine Antwort darauf ausgerichtet, sie vom Standpunkt der Produktionsunterstützung aus zu betrachten. Das heißt, wir ordnen ungefähr wie folgt zu:

  • Fehler : Das System befindet sich in einer Notlage, Kunden sind wahrscheinlich betroffen (oder werden es bald sein) und das Update erfordert wahrscheinlich menschliches Eingreifen. Hier gilt die "2AM-Regel". Wenn Sie auf Abruf sind, möchten Sie in diesem Fall um 2 Uhr morgens geweckt werden? Wenn ja, protokollieren Sie es als "Fehler".

  • warnen : Ein unerwartetes technisches oder geschäftliches Ereignis ist eingetreten. Kunden sind möglicherweise betroffen, aber wahrscheinlich ist kein sofortiger menschlicher Eingriff erforderlich. Bereitschaftsdienste werden nicht sofort angerufen, aber das Support-Personal sollte diese Probleme so schnell wie möglich prüfen, um die Auswirkungen zu verstehen. Grundsätzlich jedes Problem, das verfolgt werden muss, aber möglicherweise kein sofortiges Eingreifen erfordert.

  • info : Dinge, die wir in großem Umfang sehen möchten, falls wir ein Problem forensisch analysieren müssen. Systemlebenszyklusereignisse (Systemstart, -stopp) finden Sie hier. "Sitzungs" -Lebenszyklusereignisse (Anmelden, Abmelden usw.) finden Sie hier. Auch wichtige Grenzereignisse sollten berücksichtigt werden (z. B. Datenbankaufrufe, Remote-API-Aufrufe). Hier können typische Geschäftsausnahmen auftreten (z. B. fehlgeschlagene Anmeldung aufgrund falscher Anmeldeinformationen). Jedes andere Ereignis, von dem Sie glauben, dass Sie es in der Produktion mit hohem Volumen sehen müssen, finden Sie hier.

  • Debug : Fast alles, was die "Info" nicht schneidet ... jede Nachricht, die hilfreich ist, um den Fluss durch das System zu verfolgen und Probleme zu isolieren, insbesondere während der Entwicklungs- und QS-Phase. Wir verwenden Protokolle auf "Debug" -Ebene zum Ein- und Aussteigen der meisten nicht trivialen Methoden und zum Markieren interessanter Ereignisse und Entscheidungspunkte innerhalb von Methoden.

  • trace : Wir verwenden dies nicht oft, aber dies gilt für äußerst detaillierte und potenziell hochvolumige Protokolle, die normalerweise auch während der normalen Entwicklung nicht aktiviert werden sollen. Beispiele hierfür sind das Speichern einer vollständigen Objekthierarchie, das Protokollieren eines Status während jeder Iteration einer großen Schleife usw.

Als oder wichtiger als die Auswahl der richtigen Protokollebenen ist es sicherzustellen, dass die Protokolle aussagekräftig sind und den erforderlichen Kontext haben. Beispielsweise möchten Sie fast immer die Thread-ID in die Protokolle aufnehmen, damit Sie bei Bedarf einem einzelnen Thread folgen können. Möglicherweise möchten Sie auch einen Mechanismus verwenden, um Geschäftsinformationen (z. B. Benutzer-ID) dem Thread zuzuordnen, damit dieser ebenfalls protokolliert wird. In Ihre Protokollnachricht möchten Sie genügend Informationen aufnehmen, um sicherzustellen, dass die Nachricht umsetzbar ist. Ein Protokoll wie "FileNotFound-Ausnahme abgefangen" ist nicht sehr hilfreich. Eine bessere Meldung lautet "FileNotFound-Ausnahme beim Versuch, die Konfigurationsdatei zu öffnen: /usr/local/app/somefile.txt. UserId = 12344".

Es gibt auch eine Reihe guter Anleitungen zur Protokollierung ... hier ist beispielsweise ein bearbeiteter Ausschnitt aus JCL (Jakarta Commons Logging) :

  • Fehler - Andere Laufzeitfehler oder unerwartete Bedingungen. Erwarten Sie, dass diese auf einer Statuskonsole sofort sichtbar sind.
  • warn - 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.
  • 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.
  • Debug - detaillierte Informationen zum Fluss durch das System. Erwarten Sie, dass diese nur in Protokolle geschrieben werden.
  • trace - detailliertere Informationen. Erwarten Sie, dass diese nur in Protokolle geschrieben werden.

1
Interessant, also nehme ich an, wenn Sie API-Anfragen protokollieren und ein Benutzer einen Fehler mit einem Parameterformat (IllegalArgumentException) macht, ist dies eine INFO-Ebene, oder?
Emilio

51

Mein Ansatz ist meiner Meinung nach eher aus entwicklungspolitischer als aus betrieblicher Sicht:

  • Fehler bedeutet, dass die Ausführung einer Aufgabe nicht abgeschlossen werden konnte. Eine E-Mail konnte nicht gesendet werden, eine Seite konnte nicht gerendert werden, einige Daten konnten nicht in einer Datenbank gespeichert werden. Etwas ist definitiv schief gelaufen.
  • Warnung bedeutet, dass etwas Unerwartetes passiert ist, die Ausführung jedoch fortgesetzt werden kann, möglicherweise in einem verschlechterten Modus. Es fehlte eine Konfigurationsdatei, aber es wurden Standardeinstellungen verwendet, ein Preis wurde als negativ berechnet, daher wurde er auf Null geklemmt usw. Etwas stimmt nicht, aber es ist noch nicht richtig schief gelaufen - Warnungen sind oft ein Zeichen dafür, dass dies der Fall sein wird ein Fehler sehr bald.
  • Info bedeutet, dass etwas Normales, aber Bedeutendes passiert ist. Das System wurde gestartet, das System gestoppt, der tägliche Inventaraktualisierungsjob wurde ausgeführt usw. Es sollte keinen kontinuierlichen Strom von diesen geben, sonst gibt es einfach zu viel zum Lesen.
  • Debug bedeutet, dass etwas Normales und Unbedeutendes passiert ist. Ein neuer Benutzer kam auf die Website, eine Seite wurde gerendert, eine Bestellung wurde entgegengenommen, ein Preis wurde aktualisiert. Dies ist das Zeug, das von den Informationen ausgeschlossen ist, weil es zu viel davon geben würde.
  • Trace ist etwas, das ich noch nie benutzt habe.

18

Dies kann auch tangential Hilfe, zu verstehen , wenn eine Logging - Anforderung (aus dem Code) auf einem bestimmten Niveau darin führt tatsächlich die gegebene protokollierte wirksame Protokollierungsebene , dass ein Einsatz mit konfiguriert ist . Entscheiden Sie, was effektiv ist Ebene Sie Sie mit der Bereitstellung konfigurieren möchten mit den anderen Antworten hier, und dann auf diese beziehen , um zu sehen , ob eine bestimmte Logging - Anfrage aus dem Code tatsächlich dann angemeldet werden ...

Zum Beispiel :

  • "Wird eine Protokollierungscodezeile, die bei WARN protokolliert wird, tatsächlich in meiner mit ERROR konfigurierten Bereitstellung protokolliert?" Auf dem Tisch steht NEIN.
  • "Wird eine Protokollierungscodezeile, die bei WARN protokolliert wird, tatsächlich in meiner mit DEBUG konfigurierten Bereitstellung protokolliert?" Auf dem Tisch steht JA.

aus der Logback-Dokumentation :

Auf grafischere Weise funktioniert die Auswahlregel wie folgt. In der folgenden Tabelle zeigt der vertikale Header die mit p bezeichnete Ebene der Protokollierungsanforderung, während der horizontale Header die mit q bezeichnete effektive Ebene des Loggers anzeigt. Der Schnittpunkt der Zeilen (Ebenenanforderung) und Spalten (effektive Ebene) ist der Boolesche Wert, der sich aus der grundlegenden Auswahlregel ergibt. Geben Sie hier die Bildbeschreibung ein

Eine Codezeile, die eine Protokollierung anfordert, wird also nur dann tatsächlich protokolliert, wenn die effektive Protokollierungsstufe ihrer Bereitstellung kleiner oder gleich dem angeforderten Schweregrad dieser Codezeile ist .


8

Ich beantworte dies anhand einer komponentenbasierten Architektur, in der eine Organisation möglicherweise viele Komponenten ausführt, die möglicherweise aufeinander angewiesen sind. Während eines Ausbreitungsfehlers sollten Protokollierungsstufen helfen, zu identifizieren, welche Komponenten betroffen sind und welche eine Grundursache sind.

  • FEHLER - Diese Komponente hat einen Fehler und die Ursache wird als intern angesehen (jede interne, nicht behandelte Ausnahme, Fehler der gekapselten Abhängigkeit ... z. B. Datenbank, REST-Beispiel wäre, dass sie einen 4xx-Fehler von einer Abhängigkeit erhalten hat). Holen Sie mich (Betreuer dieser Komponente) aus dem Bett.

  • WARNUNG - Bei dieser Komponente ist ein Fehler aufgetreten, der vermutlich von einer abhängigen Komponente verursacht wurde (REST-Beispiel wäre ein 5xx-Status aus einer Abhängigkeit). Holen Sie sich die Betreuer dieser Komponente aus dem Bett.

  • INFO - Alles andere, was wir zu einem Operator bringen möchten. Wenn Sie sich entscheiden, glückliche Pfade zu protokollieren, empfehle ich, auf 1 Protokollnachricht pro wichtigen Vorgang (z. B. pro eingehender http-Anforderung) zu beschränken.

Stellen Sie für alle Protokollnachrichten sicher, dass Sie den nützlichen Kontext protokollieren (und legen Sie Wert darauf, dass Nachrichten für den Menschen lesbar / nützlich sind, anstatt Unmengen von "Fehlercodes" zu haben).

  • DEBUG (und darunter) - Sollte überhaupt nicht verwendet werden (und schon gar nicht in der Produktion). In der Entwicklung würde ich empfehlen, eine Kombination aus TDD und Debugging (falls erforderlich) zu verwenden, anstatt Code mit Protokollanweisungen zu verschmutzen. In der Produktion sollte die oben genannte INFO-Protokollierung in Kombination mit anderen Metriken ausreichend sein.

Eine gute Möglichkeit, die oben genannten Protokollierungsstufen zu visualisieren, besteht darin, sich eine Reihe von Überwachungsbildschirmen für jede Komponente vorzustellen. Wenn alle gut laufen, sind sie grün. Wenn eine Komponente eine WARNUNG protokolliert, wird sie orange (gelb). Wenn irgendetwas einen FEHLER protokolliert, wird sie rot.

Im Falle eines Vorfalls sollte eine Komponente (Grundursache) rot und alle betroffenen Komponenten orange / gelb sein.


2
+1 für die Monitor-Analogie - hilft wirklich zu visualisieren, warum Sie die Pegel so eingestellt haben
emragins

3

Nicht anders für andere Antworten, mein Framework hat fast die gleichen Ebenen:

  1. Fehler: Kritische logische Fehler in der Anwendung, z. B. ein Zeitlimit für die Datenbankverbindung. Dinge, die in naher Zukunft eine Fehlerbehebung erfordern
  2. Achtung: Nicht brechende Themen, aber Dinge, auf die man achten muss. Wie eine angeforderte Seite nicht gefunden
  3. Info: Wird in der ersten Zeile der Funktionen / Methoden verwendet, um eine aufgerufene Prozedur oder einen Schritt anzuzeigen, der in Ordnung ist, wie eine Einfügeabfrage
  4. log: Logikinformationen, wie das Ergebnis einer if-Anweisung
  5. Debug: Variable Inhalte, die relevant sind, um permanent überwacht zu werden
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.