Python-Protokollierung: Ein ausführliches Tutorial
Python-Protokollierung: Ein ausführliches Tutorial - Das Python-Protokollierungsmodul wird mit der Standardbibliothek geliefert und bietet grundlegende Protokollierungsfunktionen. Bei korrekter Einrichtung kann eine Log-Meldung
Da Anwendungen komplexer werden, haben gut logs können sehr nützlich sein, nicht nur beim Debuggen, sondern auch, um Einblicke in Anwendungsprobleme/Leistung zu geben.
Die Python-Standardbibliothek wird mit einem Protokollierung Modul, das die meisten grundlegenden Protokollierungsfunktionen bereitstellt. Bei korrekter Einrichtung kann eine Protokollnachricht viele nützliche Informationen darüber liefern, wann und wo das Protokoll ausgelöst wird, sowie über den Protokollkontext, z. B. den laufenden Prozess/Thread.
Trotz der Vorteile wird das Logging-Modul oft übersehen, da es einige Zeit braucht, um es richtig einzurichten und obwohl es meiner Meinung nach vollständig ist, ist das offizielle Logging-Dokument unter https://docs.python.org/3/library/logging.html gibt nicht wirklich Best Practices für die Protokollierung oder hebt einige Überraschungen bei der Protokollierung hervor.
Dieses Python-Logging-Tutorial ist kein vollständiges Dokument über das Logging-Modul, sondern ein Leitfaden für die ersten Schritte, der einige Logging-Konzepte sowie einige Fallstricke vorstellt, auf die Sie achten sollten. Der Beitrag endet mit Best Practices und enthält einige Hinweise zu fortgeschritteneren Protokollierungsthemen.
So zeigen Sie private Tweets 2020 an
Bitte beachten Sie, dass alle Code-Schnipsel im Beitrag davon ausgehen, dass Sie das Logging-Modul bereits importiert haben:
import logging
Konzepte für die Python-Protokollierung
Dieser Abschnitt gibt einen Überblick über einige Konzepte, die häufig im Protokollierungsmodul anzutreffen sind.
Python-Protokollierungsebenen
Der Log-Level entspricht der Wichtigkeit, die einem Log beigemessen wird: Ein Fehler-Log sollte dann dringender sein als das Warn-Log, wohingegen ein Debug-Log nur beim Debuggen der Anwendung nützlich sein sollte.
Es gibt sechs Protokollebenen in Python; jeder Ebene ist eine ganze Zahl zugeordnet, die den Schweregrad des Protokolls angibt: NOTSET=0, DEBUG=10, INFO=20, WARN=30, ERROR=40 und CRITICAL=50.
Azure Key Vault lokale Entwicklung
Alle Level sind ziemlich einfach (DEBUG Der Protokollformatierer reichert eine Protokollnachricht grundsätzlich an, indem er Kontextinformationen hinzufügt. Es kann nützlich sein zu wissen, wann das Protokoll gesendet wird, wohin (Python-Datei, Zeilennummer, Methode usw.) und zusätzlicher Kontext wie Thread und Prozess (kann beim Debuggen einer Multithread-Anwendung äußerst nützlich sein). Wenn beispielsweise ein Log Hello World über einen Log-Formatierer gesendet wird: es wird werden Der Log-Handler ist die Komponente, die effektiv ein Protokoll schreibt/anzeigt: Zeigen Sie es in der Konsole (über StreamHandler), in einer Datei (über FileHandler) an oder senden Sie Ihnen sogar eine E-Mail über SMTPHandler usw. Jeder Protokollhandler hat 2 wichtige Felder: Die Standardbibliothek bietet eine Handvoll Handler, die für allgemeine Anwendungsfälle ausreichen sollten: https://docs.python.org/3/library/logging.handlers.html#module-logging.handlers . Die gängigsten sind StreamHandler und FileHandler: Logger ist wahrscheinlich derjenige, der am häufigsten direkt im Code verwendet wird und auch der komplizierteste ist. Einen neuen Logger erhalten Sie wie folgt: Ein Logger hat drei Hauptfelder: Ein Logger ist einzigartig nach Namen, d.h. wenn ein Logger mit dem Namen toto erstellt wurde, werden die folgenden Aufrufe von |_+_| gibt das gleiche Objekt zurück: Wie Sie vielleicht schon vermutet haben, haben Logger eine Hierarchie. Ganz oben in der Hierarchie befindet sich der Root-Logger, auf den über die Datei logging.root zugegriffen werden kann. Dieser Logger wird aufgerufen, wenn Methoden wie |_+_| wird genutzt. Standardmäßig ist das Root-Log-Level WARN, daher wird jedes Log mit niedrigerem Level (zB über |_+_|) ignoriert. Eine weitere Besonderheit des Root-Loggers besteht darin, dass sein Standard-Handler erstellt wird, wenn zum ersten Mal ein Protokoll mit einem höheren Level als WARN protokolliert wird. Verwenden des Root-Loggers direkt oder indirekt über Methoden wie |_+_| wird generell nicht empfohlen. Wenn ein neuer Logger erstellt wird, wird sein übergeordneter Logger standardmäßig auf den Root-Logger gesetzt: Der Logger verwendet jedoch die Punktnotation, was bedeutet, dass ein Logger mit dem Namen a.b dem Logger a untergeordnet ist. Dies gilt jedoch nur, wenn der Logger a erstellt wurde, andernfalls ist ab parent immer noch die Wurzel. Wenn ein Logger entscheidet, ob ein Log gemäß der Level-Prüfung bestehen soll (z. B. wenn der Log-Level niedriger als der Logger-Level ist, wird das Log ignoriert), verwendet er seinen effektiven Level anstelle des tatsächlichen Levels. Der effektive Pegel ist der gleiche wie der Logger-Pegel, wenn der Pegel nicht NOTSET ist, d. h. alle Werte von DEBUG bis CRITICAL; Wenn der Logger-Level jedoch NOTSET ist, ist der effektive Level der erste Vorfahren-Level, der einen Nicht-NOTSET-Level hat. Standardmäßig hat ein neuer Logger den NOTSET-Level, und da der Root-Logger einen WARN-Level hat, ist der effektive Logger-Level WARN. Selbst wenn an einen neuen Logger einige Handler angehängt sind, werden diese Handler nicht aufgerufen, es sei denn, die Protokollebene überschreitet WARN: Standardmäßig wird der Logger-Level verwendet, um zu entscheiden, ob ein Log durchläuft: Wenn der Log-Level niedriger als der Logger-Level ist, wird das Log ignoriert. Das Logging-Modul ist zwar sehr praktisch, enthält aber einige Macken, die selbst den Besten stundenlange Kopfschmerzen bereiten können Python Entwickler. Hier sind meiner Meinung nach die Best Practices für die Verwendung dieses Moduls: Nachdem Sie einen neuen Logger erstellen und verwenden können: #PythonFormatierung der Python-Protokollierung
'%(asctime)s — %(name)s — %(levelname)s — %(funcName)s:%(lineno)d — %(message)s'
2018-02-07 19:47:41,864 - a.b.c - WARNING - :1 - hello world
was ist webroot passwort manager
Python-Logging-Handler
console_handler = logging.StreamHandler() file_handler = logging.FileHandler('filename')
Python-Logger
toto_logger = logging.getLogger('toto')
Der Unreal-Engine-Entwicklerkurs - C++ lernen und Spiele erstellen
logging.getLogger('toto')
wo kann man pols-münzen kaufen
assert id(logging.getLogger('toto')) == id(logging.getLogger('toto'))
logging.debug()
logging.info('info')
Best Practices für die Python-Protokollierung
logging.debug()
lab = logging.getLogger('a.b') assert lab.parent == logging.root # lab's parent is indeed the root logger