Ich musste kürzlich ein Feldproblem für unsere Großunternehmensanwendung untersuchen. Ich war entsetzt über die Protokolle , die ich durchkämmen musste, um das Problem zu finden, und am Ende des Tages halfen die Protokolle überhaupt nicht, den Fehler zu identifizieren / zu isolieren.
Hinweis: Ich verstehe, dass nicht alle Fehler durch Protokolle auffindbar sind. Dies ändert nichts an der Tatsache, dass die Protokolle schrecklich sind.
Es gibt einige offensichtliche Probleme mit unserer Protokollierung, die wir bereits beheben können. Ich möchte diese hier nicht auflisten und kann Ihnen nicht einfach unsere Protokolldateien anzeigen, damit Sie Ratschläge geben können, was zu tun ist.
Stattdessen würde ich gerne wissen, um zu beurteilen, wie schlecht wir es mit der Protokollierung machen:
- Was sind einige Richtlinien , wenn überhaupt, wenn es um die Anmeldung kommt für eine Anwendung, vor allem große Anwendung.
- Gibt es Muster, denen wir folgen sollten, oder Anti-Muster, die uns bewusst sein sollten?
- Ist es wichtig, das Problem zu beheben, oder kann es sogar behoben werden, oder alle Protokolldateien sind einfach riesig und Sie benötigen zusätzliche Skripte, um sie zu analysieren?
Randnotiz: Wir verwenden log4j.
Ich arbeite mit sicherheitskritischen Echtzeitsystemen und Protokollierung ist oft die einzige Möglichkeit, seltene Fehler zu finden, die an jedem 53. Dienstag, wenn es Vollmond ist, einmal als blauer Mond auftauchen, wenn Sie meine Abweichung bemerken. Diese Art von macht Sie besessen über das Thema, so dass ich mich jetzt entschuldigen werde, wenn ich anfange, am Mund zu schäumen. Das Folgende wurde für native Code-Debug-Protokolle geschrieben, aber das meiste davon gilt auch für die verwaltete Welt ...
Verwenden Sie Textprotokolldateien. Scheint offensichtlich, aber einige Leute versuchen, binäre Protokolldateien zu generieren: Das ist einfach dumm, weil ich nicht nach einem Reader-Tool suchen muss, wenn ich auf dem Feld bin. Wenn es sich um Text handelt und das Debugging ausführlich ist, besteht eine gute Chance, dass der Außendiensttechniker die Datei lesen und das Problem diagnostizieren kann, ohne jemals zu mir zurückzukehren. Jeder gewinnt.
Ich entwerfe Systeme, die so ziemlich alles protokollieren können, aber ich schalte nicht standardmäßig alles ein. Die Debug-Informationen werden an einen verborgenen Debug-Dialog gesendet, der sie mit einem Zeitstempel versehen und in einer Listbox (vor dem Löschen auf ca. 500 Zeilen begrenzt) ausgibt. Über diesen Dialog kann ich sie anhalten, automatisch in einer Protokolldatei speichern oder umleiten ein angehängter Debugger. Diese Umleitung ermöglicht es mir, die Debug-Ausgabe mehrerer Anwendungen sauber zu serialisieren, was manchmal lebensrettend sein kann. Früher habe ich numerische Protokollierungsstufen verwendet (je höher die Stufe eingestellt ist, desto mehr wird erfasst):
Dies ist jedoch zu unflexibel - wenn Sie sich auf einen Fehler zuarbeiten, ist es viel effizienter, sich auf das zu konzentrieren, was Sie benötigen, ohne durch Tonnen von Abfällen waten zu müssen. Dies kann eine bestimmte Art von Transaktion oder Operation sein das verursacht den Fehler. Wenn Sie dafür alles einschalten müssen, erschweren Sie nur Ihren eigenen Job. Sie brauchen etwas Feinkörnigeres.
Jetzt bin ich also dabei, auf die Protokollierung basierend auf einem Flaggensystem umzusteigen. Alles, was protokolliert wird, hat eine Markierung, die angibt, um welche Art von Operation es sich handelt, und es gibt eine Reihe von Kontrollkästchen, mit denen ich definieren kann, was protokolliert wird. Normalerweise sieht diese Liste folgendermaßen aus:
Dieses Protokollierungssystem wird mit dem Release- Build geliefert , ist aktiviert und wird standardmäßig in einer Datei gespeichert. Es ist zu spät, um herauszufinden, ob Sie nach dem Auftreten des Fehlers protokolliert haben sollten, wenn dieser Fehler im Durchschnitt nur einmal alle sechs Monate auftritt und Sie keine Möglichkeit haben, ihn zu reproduzieren. Protokollierung, die nur mit Debugbuilds funktioniert, ist gerecht. einfach. Dumm.
Die Software wird normalerweise mit aktiviertem ERROR, BASIC, STATE_CHANGE und EXCEPTION ausgeliefert. Dies kann jedoch im Feld über das Debug-Dialogfeld (oder über eine Registrierung / ini / cfg-Einstellung, in der diese Dinge gespeichert werden) geändert werden.
Ach ja, mein Debug-System generiert eine Datei pro Tag. Ihre Anforderungen können unterschiedlich sein. Stellen Sie jedoch sicher, dass Ihr Debug-Code jede Datei mit dem Datum, der Version des von Ihnen ausgeführten Codes und, falls möglich, einem Marker für die Kunden-ID, den Standort des Systems oder was auch immer startet . Sie können eine ganze Menge von Protokolldateien aus dem Feld abrufen, und Sie benötigen Aufzeichnungen darüber, was von wo kam und welche Version des Systems, auf dem sie ausgeführt wurden, tatsächlich in den Daten selbst enthalten ist, und Sie können dem Kunden nicht vertrauen / Außendiensttechniker, um Ihnen zu sagen, welche Version sie haben - sie können Ihnen nur sagen, welche Version sie DENKEN, dass sie haben. Schlimmer noch, sie melden möglicherweise die exe-Version, die sich auf der Festplatte befindet, aber die alte Version wird noch ausgeführt, da sie nach dem Ersetzen vergessen haben, einen Neustart durchzuführen. Lassen Sie sich von Ihrem Code erzählen.
Schließlich möchten Sie nicht, dass Ihr Code eigene Probleme erzeugt. Verwenden Sie daher eine Timer-Funktion, um die Protokolldateien nach so vielen Tagen oder Wochen zu löschen (überprüfen Sie einfach den Unterschied zwischen dem aktuellen Zeitpunkt und dem Zeitpunkt der Dateierstellung). Dies ist in Ordnung für eine Server-App, die ständig ausgeführt wird. Auf einer clientseitigen App können Sie beim Start alle alten Daten löschen. In der Regel wird das System nach etwa 30 Tagen gelöscht. Bei einem System ohne häufige Technikerbesuche möchten Sie es möglicherweise länger belassen. Dies hängt natürlich auch von der Größe Ihrer Protokolldateien ab.
quelle
Meine bevorzugte öffentliche Ressource für Richtlinien zur Protokollierung sind Apache JCL Best Practices .
Trotz der Ausrichtung auf JCL scheinen diese generisch genug zu sein, um für die Protokollierung im Allgemeinen übernommen zu werden.
Das bekannteste Anti-Pattern ist wahrscheinlich das "Verschlucken von Ausnahmen" - suchen Sie einfach im Web danach.
Bei großen Protokolldateien war dies in meiner Praxis meistens der Normalfall. Und ja, ergänzende Skripte, wie Sie sie nennen, und / oder Werkzeuge wie Kettensäge sehen für mich ebenfalls normal aus.
PS. In Bezug auf Anti-Muster sind andere, die mir in den Sinn kommen, "überschwemmende" und sinnlose Botschaften.
Ich nenne es Flooding, wenn ich mehrere ähnliche Nachrichten aus einer Schleife mit vielen Iterationen sehe. Überschwemmungen sind für mich ärgerlich genug, um sie loszuwerden, wenn ich sie im Quellcode finde. Normalerweise erfordert das Verbessern etwas Kunst - denn Dinge, die innerhalb der Schleife passieren, können interessant sein. Wenn ich keine Zeit habe, um es tiefer zu verbessern, versuche ich, die Protokollierungsstufe solcher Nachrichten auf die niedrigste zu ändern, um das Herausfiltern zu vereinfachen.
Sinnlose Botschaften scheinen ziemlich populärer Müll zu sein. Diese sehen beim Einlesen des Quellcodes harmlos aus - ich schätze, man muss sich die Mühe machen, die Debug-Ausgabe so zu analysieren, dass sie aussieht wie ...
... um ihre inhärente Hässlichkeit zutiefst zu würdigen. Meine bevorzugte Heuristik zur Erkennung dieser Art von Problemen auf Quellcodeebene (vorgeschlagen von einem Kollegen in einem meiner früheren Projekte) ist die Berechnung der Anzahl von Leerzeichensymbolvorkommen in Zeichenfolgenliteralen, die bei der Protokollierung verwendet werden. Meiner Erfahrung nach garantiert null Leerzeichen, dass die Protokollierungsanweisung sinnlos ist, ein Leerzeichen ist auch ein guter Indikator für das potenzielle Problem.
quelle
somethingSpecialHappenedCount
) gespeichert und dann an den Logger ausgegeben werden sollte.Ausnahme nur einmal protokollieren!
Einer der häufigsten Probleme, die mir aufgefallen sind, ist das Protokollieren und erneutes Auslösen einer Ausnahme. Infolgedessen enthalten die Protokolldateien dieselben Ausnahmen mehrmals auf mehreren Stapelebenen.
quelle
Hier ist ein Anti-Muster: Erstellen Sie zwei Dutzend "generische Variablen" -Felder in einer Datenbanktabelle, um alles Mögliche nachzuverfolgen, und führen Sie dann 88 verschiedene Aufzählungswerte für verschiedene Arten von Protokollen durch (und zählen sie).
quelle
Meine Erfahrung mit Protokollen ist umso größer, je besser, aber so konsistent, dass sie maschinell gefiltert werden können, und dass für jede Komponente Ihrer Anwendung individuell ein Schweregrad konfiguriert werden kann.
Außerdem ist es sehr schwierig vorherzusagen, welche Protokollierung Sie benötigen, um einen zukünftigen Fehler zu finden. Die meisten offensichtlichen Fehlerquellen werden behoben, bevor das Produkt aus der Tür geht. Es ist nicht ungewöhnlich, dass Sie als Ergebnis eines Fehlerberichts die Protokollierung hinzugefügt haben, um die Diagnose zu vereinfachen, falls es erneut auftritt.
quelle
Ein paar Notizen von der Operationsseite des Hauses hier:
1) Stellen Sie sicher, dass die Protokolle lokal konfigurierbar sind, vorzugsweise mit einem Tool, das nicht schwerer als ein Texteditor ist. Die meiste Zeit wollen wir keine Protokollierung auf TRACE-Ebene, aber wir lieben es, sie einschalten zu können.
2) Stellen Sie nach Möglichkeit sicher, dass die Protokolle mit einem Tool gelesen werden können, das nicht schwerer als ein Texteditor ist. Nichts ist schlimmer, als zu einer ungeraden Stunde auf Werkzeugsuche gehen zu müssen, wenn das Produktionssystem ausfällt.
quelle
Aus eigener Erfahrung mit Webanwendungen:
(& wenn man bedenkt, dass Speicher heutzutage sehr billig ist)
Seien Sie konsistent mit Ihren Log-Strings. Da ich immer diese Art von Muster benutze:
quelle
Protokollieren Sie neben dem Stacktrace den aktuellen Anwendungsstatus und die Eingabe.
Software ist deterministisch, diese beiden sind normalerweise das einzige, was Sie brauchen, um den Fehler zu reproduzieren. Das Speichern des vollständigen Zustands kann in einigen Fällen problematisch sein, daher sind auch Möglichkeiten zum Reproduzieren des aktuellen Zustands, beispielsweise durch vorherige Eingaben, gut.
Natürlich sind mehr Daten immer besser, aber mindestens diese beiden sind ein guter Anfang für die einfachsten Abstürze.
quelle