Wie soll ich mit Loggerfehlern umgehen?

12

In einigen Anwendungen unseres Unternehmens verwenden wir einen benutzerdefinierten Logger. Es ist ziemlich robust, obwohl wir es in Zukunft vielleicht durch so etwas wie NLog ersetzen werden. Eine der Aufgaben des Protokollierers besteht darin, alle in der Anwendung aufgetretenen Ausnahmen zu protokollieren.

Eine Sorge, die ich immer hatte, ist, dass die Ausnahmebehandlung im Logger einen stillen Fehler ermöglicht. Das heißt, wenn das Protokoll für eine bestimmte Ausnahme nicht geschrieben wurde (aufgrund eines Fehlers im Protokoll), wie soll ich damit umgehen und die Ausnahme (irgendwie) im Protokoll selbst protokollieren ?

Angenommen, die WriteLog-Funktion löst eine Ausnahme aus. Sollte ich mehrmals versuchen, die Funktion aufzurufen, oder bis die Ausnahme nicht mehr geworfen wird? Sollte ich versuchen, die ausgelöste Ausnahme mit dem Logger zu schreiben (was wahrscheinlich nur zu Ausnahmen bis zum Ende führen würde ...)? Ich hatte das Glück, dass ich auf diese Situation nur stieß, als wir den benutzerdefinierten Logger zum ersten Mal implementierten. Andererseits habe ich im Moment keine Möglichkeit zu wissen, ob der Logger Anwendungsausnahmen (aufgrund seiner eigenen Ausnahmen) nicht protokollieren konnte.

Ich habe versucht, online und auf einigen SE-Websites zu suchen, aber es war bisher erfolglos, da alle Posts Fehler in einem Protokoll (aber keine möglichen Ausnahmen und wie man sie protokolliert) oder Ausnahmen außerhalb des Protokolls behandeln.

Zairja
quelle
5
Melden Sie sich an, stderrdass Ihr Ausgabemedium ausgefallen ist oder dass das "Unmögliche" geschehen ist.
Doval
1
Senden Sie eine E-Mail an die Entwickler oder zeigen Sie den Fehler einfach mit einer E-Mail-Adresse an und lassen Sie den Benutzer den Fehler kopieren und einfügen.
Chloe

Antworten:

17

Wenn im Logger selbst Ausnahmen auftreten, sollten Sie den Logger nicht verwenden, um eigene Ausnahmen zu protokollieren. Der Grund dafür ist, dass:

  • Sie befinden sich möglicherweise in einer Endlosschleife. Stellen Sie sich vor, Sie haben in Ihrem Logger einen bedingten Zweig, der nicht getestet wurde (und eine Ausnahme generiert). Stellen Sie sich vor, sobald die Bedingung erfüllt ist, werden alle weiteren gemeldeten Ausnahmen von derselben Verzweigung behandelt. Dies bedeutet, dass Sie sich ab dem Moment der Ausführung der Verzweigung in einer Endlosschleife befinden.

  • Möglicherweise stecken Sie in einer temporären Schleife und generieren Tausende von Ausnahmen pro Sekunde. Stellen Sie sich vor, Sie melden Ausnahmen an einen Remote-Server. Ein Problem mit dem Server führt zu einer weiteren Ausnahme, die eine weitere auslöst, usw., bis die Verbindung wieder hergestellt ist.

Sie sollten stattdessen auf eine sicherere Methode zurückgreifen, um die Ausnahmen zu protokollieren. Wenn Ihr Logger beispielsweise die Ausnahmen an einen Remote-Server sendet, senden Sie die Ausnahmen im Logger ansyslog stattdessen . Wenn Ihre Protokollierung Ausnahmen in Windows-Ereignissen aufzeichnet und diese Aktion fehlschlägt, speichern Sie die Fehlerausnahme in einer einfachen Textdatei.

Sobald Sie das haben, ist die nächste Frage, woher Sie wissen, dass diese Ausnahmen aufgetreten sind: Wenn Sie Dutzende von Anwendungen auf Tausenden von Servern ausführen, können Sie möglicherweise nicht jede von ihnen regelmäßig per SSH überprüfen, um zu überprüfen, ob sie lokal etwas protokollierten .

Eine Möglichkeit besteht darin, einen Cron-Job zu haben, der nach diesen „außergewöhnlichen Protokollen“ sucht und sie an den Ort schiebt, an dem andere Ausnahmen gespeichert sind (eventuell mit Ihrem Logger, aber achten Sie auf unendliche oder vorübergehende Schleifen!).

Arseni Mourzenko
quelle
Ich habe dasselbe Problem mit meinem Ausnahmelogger festgestellt, der per E-Mail gesendet wurde. Wenn es keine Verbindung zu einem Server herstellen konnte, geriet es in eine schreckliche Endlosschleife. Stattdessen habe ich ein Häkchen gesetzt, um zum Ereignisprotokoll umzuleiten und zu verhindern, dass neue E-Mails gesendet werden, bis eine neue Verbindung hergestellt werden kann.
mgw854
Ich denke, wir werden versuchen, einen Fallback zu implementieren, wie Sie vorschlagen. Jon Raynors Vorschlag, die Anwendung zu stoppen (in einer kritischen Protokollierungssituation), ist möglicherweise auch einer, den wir nicht in Betracht gezogen haben.
Zairja
Was ist, wenn Sie am Ende Zeitüberschreitungen beim Senden an Syslog oder E / A-Fehler beim Schreiben in eine Datei haben? Sie können das Problem immer noch verschlimmern, wenn die Fehler auf ein überlastetes Netzwerk zurückzuführen sind oder der Speicherplatz knapp wird. Dies ist keine ganzheitliche Lösung. Sie müssen die Möglichkeit in Betracht ziehen, dass es möglicherweise keinen sicheren Weg gibt, die Fehler zu protokollieren. Es ist nicht so gefährlich, sich bei Ihrem eigenen Logger anzumelden, solange Sie Zykluserkennung, exponentielles
Zurücksetzen
11

Wenn die Protokollierung für Ihre Anwendung von entscheidender Bedeutung ist, sollten Sie die Anwendung stoppen, wenn die Protokollierung fehlschlägt.

Wenn dies nicht kritisch ist, kann eine etwas defensive Komponente für die Behandlung von Protokollierungsfehlern eingesetzt werden, die Protokolle / Warnungen an eine sekundäre Quelle senden. Aber auch das ist kein Kinderspiel und Sie müssen sich überlegen, was passiert, wenn der sekundäre Logger ausfällt, während er den primären Logger überwacht.

Eine gute Strategie besteht darin, in einer lokalen Datei zu protokollieren. Wenn dies fehlschlägt, können Sie diesen Fehler möglicherweise im Ereignisprotokoll protokollieren, eine E-Mail-Warnung generieren, in einer Datenbank speichern usw. Mit den verfügbaren Protokollierungs-Frameworks sollte dies narrensicher sein, sofern der Computer nicht ausgeführt wird Kein Speicherplatz mehr oder ein anderer seltener Zustand.

Im Idealfall ist es besser, wenn Sie stillschweigend versagen, da dies die Anwendung weniger komplex macht.

Noch wichtiger ist, dass Sie zur Behebung von Protokollierungsfehlern die Protokolle von einem Drittanbieter überwachen müssen. Im Laufe der Zeit sollten Sie feststellen können, wie viele Ereignisse eine fehlerfreie Anwendung protokolliert. Wenn es anfängt, nur wenige oder gar keine Ereignisse zu protokollieren, können Sie anhand der Überwachung das Problem erkennen und potenziell über den Mechanismus eines Drittanbieters alarmieren.

Jon Raynor
quelle
1
+1 zur Unterscheidung zwischen kritischer und unkritischer Protokollierung sowie zur Feststellung der Wichtigkeit der Anzahl der Protokolle pro Zeitablauf. Ich bin enttäuscht, dass ich über diese beiden Aspekte nicht nachgedacht habe, während ich seit Jahren Fallback-Protokollierung verwende.
Arseni Mourzenko