2009-08-20 2 views
1

Ich habe das Protokollierungsmodul für mein neues Python-Skript eingerichtet. Ich habe zwei Handler, einen zu einer Datei und einen für E-Mail-Benachrichtigungen. Der SMTPHandler ist so eingerichtet, dass er alles auf der ERROR-Ebene oder höher sendet.Python-Protokollierung SMTPHandler - Behandlung von Offline-SMTP-Server

Alles funktioniert gut, es sei denn, die SMTP-Verbindung schlägt fehl. Wenn der SMTP-Server nicht antwortet oder die Authentifizierung fehlschlägt (SMTP-Authentifizierung erforderlich), stirbt das gesamte Skript ab.

Ich bin ziemlich neu bei Python, also versuche ich herauszufinden, wie die Ausnahme, die der SMTPHandler erhebt, zu erfassen, so dass alle Probleme beim Senden der Protokollnachricht per E-Mail nicht mein gesamtes Skript herunterbringen wird. Da ich auch Fehler in eine Protokolldatei schreibe, möchte ich, wenn die SMTP-Warnung fehlschlägt, einfach weitermachen, nichts anhalten.

Wenn ich eine "try:" - Anweisung brauche, würde es um das Logging.handlers.SMTPHandler Setup gehen, oder um die einzelnen Aufrufe von my_logger.error()?

Antwort

4

Ausnahmen, die während der Protokollierung auftreten, sollten Ihr Skript nicht stoppen, obwohl sie möglicherweise eine Rückverfolgung auf sys.stderr gedruckt werden können. Um diesen Ausdruck zu vermeiden, gehen Sie wie folgt vor:

logging.raiseExceptions = 0 

Dies ist nicht der Standard (weil in der Entwicklung der Regel Sie Ausfälle wissen wollen), aber in der Produktion, raiseExceptions sollte nicht eingestellt werden.

Sie sollten feststellen, dass die SMTPHandler eine erneute Verbindung versucht, wenn das nächste Mal ein Fehler (oder höher) protokolliert wird.

loggingtut Pass durch SystemExit und KeyboardInterrupt Ausnahmen, aber alle anderen sollten so behandelt werden, dass sie keine Beendigung einer Anwendung verursachen, die Protokollierung verwendet. Wenn Sie feststellen, dass dies nicht der Fall ist, geben Sie bitte bestimmte Details zu den Ausnahmen an, die das Skript beenden, und zu Ihrer Version von Python/Betriebssystem. Denken Sie daran, dass das Skript scheinbar hängen bleibt, wenn ein Netzwerk-Timeout auftritt, das den Handler zum Blockieren veranlasst (z. B. wenn eine DNS-Suche lange dauert oder wenn die SMTP-Verbindung viel Zeit in Anspruch nimmt).

+0

Danke. Ich habe den raiseExceptions-Code hinzugefügt. Sie haben recht, dass es das Skript nicht beendete ... die Wiederholungen verursachten solch eine Verzögerung, die ich dachte. –

0

Sie müssen wahrscheinlich beides tun. Um das herauszufinden, schlage ich vor, einen lokalen Mailserver zu installieren und diesen zu verwenden. Auf diese Weise können Sie das Skript während der Ausführung des Skripts herunterfahren und die Fehlermeldung notieren.

Um den Code wartbar zu halten, sollten Sie SMTPHandler so erweitern, dass Sie die Ausnahmen an einem einzigen Ort behandeln können (anstatt jeden Loggeraufruf mit try-except zu umhüllen).

+0

Wir werden einen lokalen SMTP-Server für die Produktion verwenden. Der Server ist remote für dev und somit habe ich den Fehler festgestellt. –