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):
off
errors only
basic
detailed
everything
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:
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
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.