Python Log Formatierer

Aditya Raj 14 April 2022
  1. Was sind die verschiedenen Protokollierungsebenen in Python?
  2. Was ist ein Python-Log-Handler?
  3. Was ist der Python-Protokollformatierer?
  4. Schritte zum Erstellen eines Python-Protokollformatierers
  5. Fazit
Python Log Formatierer

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- oder StreamHandler-Objekt mit der FileHandler()- oder der StreamHandler()-Methode.
  • Fügen Sie das Objekt FileHandler oder StreamHandler mit der Methode addHandler() zum Logger hinzu.
  • Erstellen Sie einen Python-Protokollformatierer mit der Methode Formatter().
  • Wenden Sie den Formatierer mit der Methode setFormatter() auf das Objekt FileHandler oder StreamHandler 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.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

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

Verwandter Artikel - Python Logging