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.
Antworten:
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) :
quelle
Mein Ansatz ist meiner Meinung nach eher aus entwicklungspolitischer als aus betrieblicher Sicht:
quelle
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 :
aus der Logback-Dokumentation :
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 .
quelle
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).
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.
quelle
Nicht anders für andere Antworten, mein Framework hat fast die gleichen Ebenen:
quelle