2012-03-25 9 views
9

Das Protokollierungsmodul von Python lässt Module oder Klassen ihre eigenen Protokollierer definieren. Und verschiedene Logger können unterschiedliche Handler haben. Einige von ihnen wählen möglicherweise, in eine Datei zu loggen, während einige sich zum Beispiel auf stdout anmelden.Konfigurieren aller Logger in einer Anwendung

Jetzt verwendet meine Anwendung mehrere dieser Module, jede mit ihren eigenen Loggern, die verschiedene Handler haben. Kann ich das Protokollierungsverhalten so vereinheitlichen, dass alle Protokolle in eine von mir angegebene Protokolldatei gelangen? Mit anderen Worten, gibt es einen Weg zu .config() alle Handler der Logger gleichzeitig von einem einzigen Ort aus?

Antwort

10

Sie sollten wahrscheinlich in die Python Logging HOWTO schauen, um zu verstehen, wie es funktioniert.

Kurz gesagt, all diese Module erhalten normalerweise einen Logger der Form G_LOG = logging.getLogger('package.name') und senden Nachrichten an den Logger: G_LOG.info('some message'), G_LOG.exception('something bad happened'). Module sollten normalerweise nichts konfigurieren.

Die Anwendung, die die Module verwendet, kann auf die Protokollierung aktivieren und die Handler auf der Grundlage der Logger Namen konfigurieren:

  • hören alle Nachrichten oder
  • hören nur Nachrichten über einen bestimmten Schwellenwert, oder
  • Nachrichten hören nur von Loggern, deren Name beginnt mit package oder
  • Nachrichten hören nur von Loggern, deren Name beginnt woth package.name, etc

Der einfachste Weg ist am Anfang Ihrer Anwendung Protokollierung durch logging.basicConfig irgendwo zu konfigurieren:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(levelname)-8s %(message)s', 
        datefmt='%Y-%m-%d %H:%M:%S', 
        filename=log_file, filemode='a') 

Auf diese Weise wird schreiben Sie alle Logging-Nachrichten von allen Modulen zum log_file.

Wenn Sie eine detaillierte Protokollierung Strategie benötigen (Put-Protokolle aus verschiedenen Loggern zu verschiedenen Dateien oder stacktraces in eine separate Datei senden), ist es besser, eine Logging-Konfigurationsdatei zu definieren und die Protokollierung konfigurieren logging.config.dictConfig oder logging.config.fileConfig verwenden.

P.S. Ich schaffe in der Regel zwei Logger als Modulgrößen:

G_LOG = logging.getLogger(__name__) 
ST_LOG = logging.getLogger('stacktrace.' + __name__) 

zu G_LOG Ich sende nur einzeilige Nachrichten. Zu ST_LOG verdopple ich wichtige Nachrichten unter Verwendung ST_LOG.exception, die exc_info=True implizit hat und das stacktrace der gegenwärtigen Ausnahme schreibt.

Zu Beginn der Anwendung ich eine Konfiguration laden, die zwei Logger (für sie und zwei Dateihandler) konfiguriert: eine, die Nachrichten, die mit stacktrace beginnen empfängt und propagate=0 (dh stacktrace Nachrichten oben nicht sichtbar sind) und der Root-Logger, der den Rest der Nachrichten behandelt. Ich werde hier nicht meine vollständigen Log-Konfigurationsdateien ablegen, da es eine nützliche Heimarbeit ist, um zu verstehen, wie alles funktioniert.

+1

Ich liebe die Stacktrace-Idee, die Sie hier haben, aber ich hasse Ihre "Ich werde hier nicht meine vollständigen Log-Config-Dateien" Position. Ich mache Python dev seit fast 10 Jahren und protokolliere immer noch sehr schlecht, weil die Dokumentation so schrecklich ist. Ein paar Mal pro Jahr investiere ich ganze Arbeitstage, um etwas Besseres zu finden. Normalerweise gebe ich auf und begnüge mich mit etwas, was ich in der Vergangenheit getan habe. –

+0

@BrunoBronosky, wahrscheinlich hast du recht. Es ist eine gute Idee. – newtover