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.
stderr
dass Ihr Ausgabemedium ausgefallen ist oder dass das "Unmögliche" geschehen ist.Antworten:
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 an
syslog
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!).
quelle
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.
quelle