Frage

Ich möchte die ganze Protokollierungsfunktion meiner App vereinen. Jede Warnung ist eine Ausnahme auslösen, neben ich es fangen und geben es an den Logger. Aber die Frage: Gibt es eine Mute-Einrichtung beim Login? Manchmal wird Logger zu ausführlich. Manchmal aus dem Grunde zu laut Warnungen, ist es welche gibt ausführliche Grenze in Warnungen?

http://docs.python.org/library/logging.html

http://docs.python.org/library/warnings.html

War es hilfreich?

Lösung

Nicht nur sind dort Loglevels , aber es gibt eine wirklich flexibel Weise rel="nofollow sie zu konfigurieren. Wenn Sie logger Objekte mit dem Namen verwenden (zum Beispiel logger = logging.getLogger(...)), dann können Sie sie entsprechend konfigurieren. Das lässt Sie Ausführlichkeit konfigurieren, dass ein Subsystem-by-Subsystem Basis, wo ein Subsystem wird durch die Protokollierung Hierarchie definiert.

Die andere Option ist logging.Filter und Warning Filter die Ausgabe zu begrenzen. Ich habe diese Methode nicht verwendet, bevor aber es sieht aus wie könnte es eine bessere Passform für Ihre Bedürfnisse.

PEP-282 eine Lese für eine gute Prosa Beschreibung von der Python logging Paket. Ich denke, dass es die Funktionalität viel besser als die Modul-Dokumentation beschreibt den Fall ist.

Bearbeiten nach Klärung

Möglicherweise können Sie die Protokollierungs Teil zu handhaben mit logging.Logger mit einer benutzerdefinierten Klasse basiert auf logging.setLoggerClass() und registriert. Es klingt wirklich wie etwas ähnliches wie die syslog wollen „Letzte Nachricht wiederholt 9mal“ . Leider weiß ich nicht eine Implementierung dieses überall. Sie könnten, wenn twisted.python.log unterstützt sehen wollen diese Funktionalität.

Andere Tipps

von der Quelle die Sie erwähnt. gibt es die log-Stufen, verwenden Sie die mit Bedacht; -)

LEVELS = {'debug': logging.DEBUG,
          'info': logging.INFO,
          'warning': logging.WARNING,
          'error': logging.ERROR,
          'critical': logging.CRITICAL}

Das wird ein Problem sein, wenn Sie alle Logging-Anrufe von einer blinden Fehlerbehandlungsroutine zu machen, die nichts über den Code nicht kennen, der den Fehler ausgelöst, das ist, was Ihre Frage klingt. Wie werden Sie entscheiden, welche Logging-Anrufe bekommen gemacht und welche nicht?

Je mehr gängige Praxis ist eine solche Blöcke zu verwenden, wenn möglich zu erholen, und melden Sie einen Fehler (wirklich, wenn es ein Fehler ist, dass Sie nicht speziell vorbereitet wurden, können Sie darüber wissen wollen, ein hohes Maß verwenden) . Aber verlassen Sie sich nicht auf diese Blöcke für alle Zustand / Debug-Informationen. Besser Ihren Code mit Protokollierung Anrufe zu streuen, bevor es zu dem Fehler-Handler wird. Auf diese Weise können Sie nützliche Laufzeitinformationen über ein System beobachten, wenn es nicht scheitern und Sie können die Protokollierung Anrufe verschiedener Schwere machen. Zum Beispiel:

import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger.  Change this for better organization
# Add your appenders or what have you
def handle_error(e):
    logger.error("Unexpected error found")
    logger.warn(format_exc()) #put the traceback in the log at lower level
    ... #Your recovery code
def do_stuff():
    logger.info("Program started")
    ... #Your main code
    logger.info("Stuff done")
if __name__ == "__main__":
    try:
        do_stuff()
    except Exception,e:
        handle_error(e)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top