Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in die Protokollierung in Python (mit Beispielen)

Detaillierte Einführung in die Protokollierung in Python (mit Beispielen)

不言
不言nach vorne
2019-01-17 11:20:272690Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Einführung in die Protokollierung in Python (mit Beispielen). Freunde in Not können darauf verweisen.

Einführung

Es gibt viele grundlegende Anwendungen der Protokollierung im Internet, daher werde ich sie hier nicht vorstellen. Bevor wir den Haupttext vorstellen, schauen wir uns zunächst eine Anforderung an:

Angenommen, Sie müssen eine bestimmte Funktion in einer Klassenbibliothek kapseln, damit andere sie verwenden können. Wie gehen Sie mit den Protokollen in der Klassenbibliothek um?

Vor ein paar Jahren in einem In Projekten, die in C# entwickelt wurden, habe ich diese Methode verwendet: Definieren Sie eine Protokollierungsbasisklasse. Alle Klassen, die die Protokollierung verwenden müssen, erben diese Basisklasse LogHandler-Ereignis, das zur Implementierung bestimmter Protokollierungsaktionen verwendet wird. Gleichzeitig kann der LogHandler-Delegat der Klasse A mit dem Delegaten der Klasse B verknüpft werden. Auf LogHandler werden die Protokollinformationen der beiden Klassen addiert.

Seitdem ich mir die Implementierung der Protokollierung in Python angesehen habe, habe ich festgestellt, dass mein Ansatz wirklich schwach ist.

Ich habe die Protokollausgabe im Peewee-Framework in meinem vorherigen Blog Python: Die Verwendung von logging.NullHandler eingeführt, um es einfach auszudrücken: Ein Logger namens Peewee wird in Peewee definiert und ein NullHandler hinzugefügt Sie müssen lediglich einen bestimmten Handler hinzufügen, um das Protokoll auszugeben, was sehr praktisch ist.


Angenommen, wir haben auch einen Logger im Hauptprogramm. Nach dem Aufruf von peewee möchte ich die beiden Protokolle in derselben Protokolldatei ausgeben. Offensichtlich ist es nicht ratsam, den FileHandler zweier Protokolle auf dieselbe Protokolldatei zu verweisen, da die Gefahr einer gleichzeitigen Dateibevorzugung besteht. Natürlich können wir den Logger im Hauptprogramm auch als peewee bezeichnen, aber das ist nicht nur zu niedrig, sondern auch wenn eine andere Bibliothek aufgerufen wird, die ebenfalls einen Logger kapselt, wird es schwierig zu handhaben sein.

Logger der Baumstumpfstruktur

Das Logger-Objekt ist als Baumstruktur konzipiert und verfügt über ein übergeordnetes Attribut. Ein Logger namens root wird in der Protokollierung als Root-Knoten aller Logger definiert und das übergeordnete Attribut von root ist None. root ist global.

Wenn Sie

logging.getLogger(name=None)

aufrufen, um ein Logger-Objekt abzurufen und der Name None ist, wird der Root-Knoten root zurückgegeben. Wenn der Name „.“ enthält, beispielsweise „name = ‚a.b‘“, ist a.b der untergeordnete Knoten von a, wenn bereits ein Logger mit dem Namen „a“ vorhanden ist. Wenn kein Logger mit dem Namen „a“ vorhanden ist, ist „a.b“ der untergeordnete Knoten von „root“. . Knoten.

Nachdem der untergeordnete Logger die Verarbeitung der Protokollnachricht abgeschlossen hat, leitet er die Protokollnachricht standardmäßig an seinen übergeordneten Logger weiter. Daher müssen wir nicht Handler für alle in einer Anwendung verwendeten Logger definieren und konfigurieren. Es reicht aus, Handler für einen Logger der obersten Ebene zu konfigurieren und dann nach Bedarf untergeordnete Logger zu erstellen. Wir können diesen Übermittlungsmechanismus deaktivieren, indem wir die Propagate-Eigenschaft des Loggers auf „False“ setzen.

Was bedeutet das? Schauen wir uns den Code an:

import logging
logA = logging.getLogger('a')
logA.setLevel(logging.DEBUG)
logA.addHandler(logging.StreamHandler())
logB = logging.getLogger('a.b')
logB.addHandler(logging.StreamHandler())

Ausgabeergebnis:

Logger A
Logger B
Logger B

Der Grund, warum Logger B zweimal ausgegeben wird, liegt darin, dass logB ein untergeordneter Knoten von ist logA und Handler sind auch in logB definiert, sodass der Handler von logB einmal ausgegeben wird und der Handler von logA ebenfalls einmal, also zweimal, ausgegeben wird. Wenn Sie nur einmal ausgeben möchten, können Sie den Handler in logB löschen. Dies kann natürlich nützlich sein, insbesondere wenn Sie kein Protokollverwaltungstool zur Hand haben. Beispielsweise müssen Sie alle Protokolle im Hauptprogramm ausgeben, um die gesamte Ausführungssequenz des Programms zu verstehen. Sie möchten jedoch ein separates Protokoll eines bestimmten Moduls ausgeben, damit Sie die Fehlerberichterstattung oder die Ausführungssequenz im Programm klar verstehen können Modul.

Das vorherige Peewee-Beispiel ist einfach zu lösen. Sie müssen lediglich das übergeordnete Attribut des Peewee-Protokolls auf das Protokoll des Hauptprogramms setzen.

Fazit

Tatsächlich ist dies ein relativ leicht zu erklärendes Problem, und es besteht keine Notwendigkeit, so viel zu schreiben. Ich möchte Ihnen nicht mitteilen, wie Sie die Protokollierung in Python verwenden, aber ich möchte Ihnen eine Vorstellung davon geben, wie die Protokollierung implementiert wird, da ich auf dieses Problem gestoßen bin und eine Lösung entworfen habe, und dann war ich völlig überwältigt weg.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Protokollierung in Python (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen