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.
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. –
@BrunoBronosky, wahrscheinlich hast du recht. Es ist eine gute Idee. – newtover