Protokollnachricht in Datei und Konsole in Python

Subodh Adhikari 10 Oktober 2023
  1. Verwenden Sie das Modul logging, um die Protokollnachricht in eine Datei und Konsole in Python zu drucken
  2. Verwenden Sie das Modul logging, um die Protokollnachricht in Python an die Konsole zu drucken
  3. Verwenden Sie das Modul logging, um Protokollnachrichten in eine Datei in Python zu drucken
Protokollnachricht in Datei und Konsole in Python

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

Verwandter Artikel - Python Logging