Python Log Formatierer
- Was sind die verschiedenen Protokollierungsebenen in Python?
- Was ist ein Python-Log-Handler?
- Was ist der Python-Protokollformatierer?
- Schritte zum Erstellen eines Python-Protokollformatierers
- Fazit
Wir verwenden Protokollierung, um Informationen über die Ausführung eines Programms zu speichern. Wenn Software ausgeführt wird, werden verschiedene Warnungen ausgegeben, und manchmal treten Fehler auf. Die durch das Logging gespeicherten Daten helfen uns, die Fehlerursachen zu identifizieren. In diesem Artikel wird erläutert, wie wir einen Protokollformatierer in Python verwenden können, um die Protokolldaten in einem gewünschten Format zu speichern.
Was sind die verschiedenen Protokollierungsebenen in Python?
Die Protokollebene wird verwendet, um den Schweregrad einer Warnung oder Meldung in einer Protokolldatei zu identifizieren. In Python haben wir sechs Protokollierungsstufen: critical
, error
, warning
, info
, debug
und notset
. Von diesen hat die Stufe critical
die höchste Priorität, während die Stufe notset
die niedrigste Priorität hat. Wenn wir Protokolle in einem Programm erstellen, werden die Protokolle normalerweise auf der Standardausgabe ausgegeben. Wir können ein error
-Protokoll mit der error()
-Methode im logging
-Modul drucken. Wie unten gezeigt, nimmt die Methode error()
eine String-Nachricht und gibt sie auf der Standardausgabe aus.
import logging
logging.error("This is a sample error message")
Ausgabe:
ERROR:root:This is a sample error message
Auf ähnliche Weise können Sie ein warning
-Protokoll mit der warning()
-Methode, ein debug
-Log mit der debug()
-Methode, ein critical
-Log mit der critical()
-Methode und ein info
-Log drucken mit der Methode info()
wie unten gezeigt.
import logging
logging.debug("This is a sample debug message")
logging.info("This is a sample info message")
logging.warning("This is a sample warning message")
logging.error("This is a sample error message")
logging.critical("This is a sample critical message")
Ausgabe:
WARNING:root:This is a sample warning message
ERROR:root:This is a sample error message
CRITICAL:root:This is a sample critical message
In der Ausgabe ist root
der Name des aktuellen Loggers. Wir können Logger auch mit der Methode getLogger()
definieren. Außerdem können Sie beobachten, dass nur die Protokolle critical
, error
und warning
gedruckt werden, während die Protokolle debug
und info
nicht gedruckt werden.
Dies liegt daran, dass die Protokollierungsstufe auf die Stufe warning
eingestellt ist. Alle Protokolle unterhalb der warning
-Stufe, d. h. info
- und debug
-Protokolle, werden nicht gedruckt. Um diese Protokolle auszudrucken, müssen wir die Protokollierungsebene auf info
setzen. Dazu verwenden wir die im Modul logging
definierte Methode setLevel()
.
Die Methode setLevel()
wird auf einem logger
-Objekt aufgerufen. Das Objekt logger
wird mit der Methode getLogger()
erstellt, die im Modul logging
definiert ist. Die Methode getLogger()
nimmt einen String als Eingabe. Der String wird als Name des Loggers vergeben. Nachdem Sie die Protokollierungsebene auf eine bestimmte Ebene eingestellt haben, werden alle Protokolle mit einer höheren Priorität als dieser Ebene gedruckt. Das folgende Beispiel zeigt, wie es funktioniert.
import logging
logger = logging.getLogger("myLogger")
logger.setLevel(logging.CRITICAL)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")
Ausgabe:
This is a sample critical message
Hier wird nur das critical
Protokoll gedruckt, da wir die Protokollierungsstufe auf critical
definiert haben. Außerdem können Sie sehen, dass nur die Nachricht gedruckt wird und nicht der Protokolltyp und das Schlüsselwort root
. Dies liegt daran, dass wir mit der Funktion getLogger()
einen benutzerdefinierten Logger namens myLogger
definiert haben. Um den Protokolltyp und den Protokollnamen zu drucken, müssen wir einen Python-Protokollformatierer verwenden.
Was ist ein Python-Log-Handler?
Durch einfaches Drucken einer Nachricht in die Protokolldatei erhalten wir keine Informationen über die Fehler. Daher müssen wir die Protokollmeldungen formatieren, um die erforderlichen Informationen aus den Protokolldateien zu erhalten. Dazu verwenden wir verschiedene Protokollformatierer und -handler.
Sie können sich die Handler-Objekte als Kanäle zum Senden von Protokollnachrichten an ihr spezifisches Ziel vorstellen. Es gibt verschiedene Arten von Handler-Objekten, wie z. B. FileHandler
- und StreamHandler
-Objekte. Das Objekt FileHandler
wird mit der Methode FileHandler()
erstellt. Wie unten gezeigt, nimmt es einen Dateinamen als Eingabe und gibt ein FileHandler
-Objekt zurück.
fileHandler = logging.FileHandler("test_file.log")
logger.addHandler(fileHandler)
Ebenso wird ein StreamHandler
-Objekt mit der StreamHandler()
-Methode erstellt. Während die FileHandler
-Objekte die Protokolle zu einer bestimmten Datei leiten, leitet das StreamHandler
-Objekt die Protokolle zu einem bestimmten Stream. Wenn wir kein Eingabeargument an die Methode StreamHandler()
übergeben, leitet sie die Protokolle an den Standardausgabestream weiter. Sie können einen StreamHandler
erstellen, wie unten gezeigt.
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
Nachdem wir ein Handler-Objekt erstellt haben, fügen wir den Handler mit der Methode addHandler()
zum Logger hinzu. Die Methode addHandler()
wird für ein logger
-Objekt aufgerufen und nimmt ein Handler-Objekt als Eingabeargument. Nach Ausführung der Methode addHandler()
wird der Handler zum logger
hinzugefügt.
Was ist der Python-Protokollformatierer?
Ein Protokollformatierer in Python wird verwendet, um die endgültige Struktur und den Inhalt der Protokolle zu konfigurieren. Mit einem Python-Protokollformatierer können wir mit dem %-Operator Protokoll name
, Uhrzeit
, Datum
, Schweregrad
und andere Informationen zusammen mit der Protokollnachricht einfügen.
Um das Format eines Protokolls zu definieren, verwenden wir die Methode Formatter()
. Die Methode Formatter()
nimmt einen String mit verschiedenen Attributen wie asctime
, name
, levelname
usw. als Eingabeargument. Nach der Ausführung gibt die Methode Formatter()
ein Formatter
-Objekt zurück.
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s")
Hier,
- Das Attribut
asctime
bezeichnet den Zeitpunkt der Erstellung des Log-Records. - Das Attribut
name
bezeichnet den Namen des Loggers, der für die Protokollierung des Anrufs verwendet wird. - Das Attribut
levelname
bezeichnet die Protokollierungsstufe der Meldung wie Debug, Info, Warnung, Fehler oder Kritisch. Sie können hier mehr über andere Protokollattribute lesen.
Nachdem wir ein Formatter
-Objekt erstellt haben, legen wir das Format des Protokolls mit der setFormatter()
-Methode fest. Die Methode setFormatter()
wird auf einem Handler-Objekt aufgerufen. Wir haben einen StreamHandler
verwendet, um die Protokolle in unserem Programm auf die Standardausgabe zu drucken. Wenn sie für ein Handler-Objekt aufgerufen wird, nimmt die Funktion setFormatter()
ein Formatter
-Objekt als Eingabeargument und legt das Protokollformat im Handler fest.
streamHandler.setFormatter(formatter)
Nachdem Sie das Format der Protokollmeldungen festgelegt haben, können Sie die Meldungen wie gewohnt protokollieren, und sie werden im definierten Format an den Ausgabestream gesendet.
import logging
logger = logging.getLogger("myLogger")
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s")
streamHandler.setFormatter(formatter)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")
Ausgabe:
2021-12-28 02:33:42,933 myLogger WARNING: This is a sample warning message
2021-12-28 02:33:42,933 myLogger ERROR: This is a sample error message
2021-12-28 02:33:42,933 myLogger CRITICAL: This is a sample critical message
Hier sehen Sie, dass wir die Meldung nur mit der Methode warning()
protokolliert haben. Das Protokoll wurde in dem Format gedruckt, das wir mit der Methode Formatter()
definiert haben. Es enthält alle Details zum Protokoll, wie Datum und Uhrzeit der Protokollerstellung, den Namen des Protokollierers und den Protokolltyp. Nachdem wir nun den gesamten Prozess in Stücken gelernt haben, habe ich den schrittweisen Prozess zum Erstellen eines Python-Protokollformatierers zum Formatieren von Protokollausgaben unten erwähnt.
Schritte zum Erstellen eines Python-Protokollformatierers
-
Erstellen Sie ein Logger-Objekt mit der Methode
getLogger()
. -
Erstellen Sie ein
FileHandler
- oderStreamHandler
-Objekt mit derFileHandler()
- oder derStreamHandler()
-Methode. -
Fügen Sie das Objekt
FileHandler
oderStreamHandler
mit der MethodeaddHandler()
zum Logger hinzu. -
Erstellen Sie einen Python-Protokollformatierer mit der Methode
Formatter()
. -
Wenden Sie den Formatierer mit der Methode
setFormatter()
auf das ObjektFileHandler
oderStreamHandler
an.
Fazit
In diesem Artikel haben wir besprochen, wie die Protokollierung in Python funktioniert. Wir haben auch Handler und Protokollformatierer in Python besprochen. In diesem Artikel haben wir das StreamHandler
-Objekt und den Protokollformatierer verwendet, um zu demonstrieren, wie die Formatierung funktioniert. Sie sollten jedoch immer das Objekt FileHandler
verwenden, um Protokolle zu erstellen, da wir Protokolle immer in Dateien speichern sollten, um sie auf Fehler zu untersuchen, wenn etwas Unerwartetes passiert. Außerdem können Sie viele andere in diesem Artikel angegebene Protokollattribute verwenden, um die Protokollmeldungen zum besseren Verständnis zu formatieren.
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub