Protokollnachricht in Datei und Konsole in Python
-
Verwenden Sie das Modul
logging
, um die Protokollnachricht in eine Datei und Konsole in Python zu drucken -
Verwenden Sie das Modul
logging
, um die Protokollnachricht in Python an die Konsole zu drucken -
Verwenden Sie das Modul
logging
, um Protokollnachrichten in eine Datei in Python zu drucken
In diesem Tutorial werden einige Methoden zum Protokollieren von Debug-Strings in einer Datei und Konsole in Python vorgestellt.
Verwenden Sie das Modul logging
, um die Protokollnachricht in eine Datei und Konsole in Python zu drucken
Die Protokollierung ist der Vorgang, bei dem verschiedene Ereignisse in einem System aufgezeichnet werden. Diese Ereignisse können Eingabedaten, Prozesse, Threads, Ausgabedaten, verarbeitete Informationen, Fehler, Warnungen, Hinweise sein. Die verschiedenen Ereignisse werden verfolgt und in einer Protokolldatei gespeichert. Das Modul logging
wird von Python bereitgestellt, das es den Programmierern ermöglicht, die verschiedenen aufgetretenen Ereignisse zu protokollieren. Das Modul hat spezifische Klassen und Methoden. Logger
, Handler
, Filter
und Formatter
sind die Grundklassen, die das Modul logging
definiert.
Die Methode basicConfig()
führt die Grundkonfiguration durch. Es erstellt einen StreamHandler
mit einem Standard Formatter
. Dann wird es zum Root-Logger hinzugefügt. Die Protokollierungsstufen werden in numerischen Werten dargestellt. Es gibt sechs Protokollierungsstufen: CRITICAL
, ERROR
, WARNING
, INFO
, DEBUG
und NOTSET
. Wir haben den Logging-Level unten auf INFO
gesetzt. Daher werden INFO
, WARNING
, ERROR
und CRITICAL
angezeigt bzw. gespeichert.
Um in die Konsole und in die Datei zu schreiben, verwenden wir logging.basicConfig()
, das Argument-Handler aufnehmen kann und die Einrichtung der Protokollierung erheblich vereinfacht, insbesondere wenn mehrere Handler mit demselben Formatierer eingerichtet werden. Wir verwenden die Methode FileHandler()
, um in eine Datei zu schreiben und verwenden debug.log
, um alle Informationen zu protokollieren. Um in eine Konsole zu schreiben, verwenden wir analog StreamHandler()
. Standardmäßig schreibt StreamHandler()
nach stderr. Um nach stdout zu schreiben, importieren wir das Modul sys
und übergeben sys.stdout
explizit an StreamHandler()
.
Im folgenden Beispiel werden die Protokolle in der Konsole und der Datei debug.log
ausgedruckt.
# python 3.x
import logging
import sys
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[logging.FileHandler("debug.log"), logging.StreamHandler(sys.stdout)],
)
logging.debug("This message is skipped as a level is set as INFO")
logging.info("So should this")
logging.warning("And this, too")
logging.error("Testing non-ASCII character, Ø and ö")
Ausgabe:
2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö
Verwenden Sie das Modul logging
, um die Protokollnachricht in Python an die Konsole zu drucken
Um das Logging zu nutzen und die Grundkonfiguration einzurichten, verwenden wir logging.basicConfig()
. Anstelle von print()
rufen wir dann logging.{level}(message)
auf, um die Nachricht in der Konsole anzuzeigen. Da wir in der Einstellung basicConfig()
level als INFO konfiguriert haben, haben wir später im Programm logging.info()
aufgerufen. Und die ganze Nachricht im String wird an logging.info()
übergeben, die dann an der Konsole angezeigt wird.
Beispielcode:
# python 3.x
import logging
logging.basicConfig(level=logging.INFO)
def area(l, b):
"""Compute the area of a rectangle"""
return l * b
logging.info(
"Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3, b=4))
)
Ausgabe:
INFO:root:Area of length: 3 and breadth: 4 is 12
Verwenden Sie das Modul logging
, um Protokollnachrichten in eine Datei in Python zu drucken
Wenn wir mehrere Module in einem Programm verwenden, hat die Verwendung des Root-Moduls schwerwiegende Einschränkungen. Deshalb müssen wir mit der Methode logger.getLogger(name)
einen neuen Logger erstellen.
Es gibt eine Konvention, die Variable __name__
als Namen des Loggers zu verwenden. Sobald wir einen neuen Logger erstellt haben, sollten wir daran denken, alle unsere Nachrichten mit der neuen Methode logger.info()
anstelle der Methode logging.info()
des Roots zu protokollieren. Ein FileHandler()
wird verwendet, um unseren benutzerdefinierten Logger dazu zu bringen, sich in einer anderen Datei anzumelden. Hier haben wir unsere Informationen in logfile.log
protokolliert. Ebenso wird ein Formatter()
verwendet, um das Format unserer protokollierten Nachrichten zu ändern. Und der Formatter
wird auf das FileHandler
-Objekt gesetzt und nicht direkt auf den Logger.
Verwenden Sie beispielsweise getLogger()
, um einen Logger zu erstellen oder abzurufen. Verwenden Sie dann die Methode setLogger()
, um den Log-Level zu setzen. Stellen Sie die Stufe auf logging.WARNING
. Als nächstes verwenden Sie die Methode FileHandler()
, um den Handler zu definieren, und die Methode Formatter()
, um den Formatierer zu setzen. Verwenden Sie dann die Methode addHandler()
, um den Handler zum Logger hinzuzufügen. Schreiben Sie abschließend einige Nachrichten zum Testen. Wir können die Protokolle in der Datei log_file.log
einsehen.
Beispielcode:
# python 3.x
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("log_file.log")
formatter = logging.Formatter(
"%(asctime)s : %(name)s : %(funcName)s : %(levelname)s : %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug("A debug message")
logger.info("An info message")
logger.warning("There is something wrong")
logger.error("An error has happened.")
logger.critical("Fatal error occured. Cannot continue")
Ausgabe:
2021-07-30 11:55:31,047 : __main__ : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__ : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__ : <module> : CRITICAL : Fatal error occured. Cannot continue