Heim >Backend-Entwicklung >Python-Tutorial >So debuggen Sie den Code des Protokollierungsmoduls in Python

So debuggen Sie den Code des Protokollierungsmoduls in Python

WBOY
WBOYnach vorne
2023-05-10 16:31:061144Durchsuche

1. Protokollhierarchie

Bevor Sie beginnen, sollten Sie beachten, dass es bei der Protokollierung eine hierarchische Struktur gibt, die als Protokollbaum oder Loggerhierarchie bezeichnet wird. Die Hierarchie besteht aus mehreren Ebenen, wobei jede Ebene einen anderen Schweregrad der Protokollinformationen darstellt. Die häufigsten Stufen sind:

KRITISCH #Ein kritischer Fehler ist aufgetreten, das Programm kann möglicherweise nicht weiter ausgeführt werden.
FEHLER #Ein Fehler ist aufgetreten, der untersucht werden sollte.
WARNUNG #Ein Hinweis darauf, dass etwas Unerwartetes passiert ist oder auf etwas hindeutet Problem in naher Zukunft.
INFO ​ #Allgemeine Informationen zur Programmausführung.
DEBUG ​ #Detaillierte Informationen für Debugging-Zwecke.

2. Erstellen Sie ein Modul

Lassen Sie uns ein Modul namens set_logging.py Python-Modul: <code>set_logging.py的python模块:

import logging
logger = logging.getLogger()
def set_logger():
  logger.setLevel(logging.INFO)
  handler = logging.StreamHandler()
  handler.setLevel(logger_level)
  formatter = logging.Formatter(&#39;%(asctime)s - %(name)s - %(levelname)s - %(message)s&#39;)
  handler.setFormatter(formatter)
  logger.addHandler(handler)

为了明确代码,我们用getLogger函数创建一个日志器实例,并使用setLevel来设置日志级别(DEBUGINFO等)。日志器的setLevel方法就像一个过滤器,它决定了一条日志信息是否应该被处理并发送给处理程序。例如,如果我们将日志记录器的级别设置为INFO,那么日志记录器就不会向处理程序发送级别为DEBUG的消息,因为它们的严重程度低于在日志记录器上设置的最低级别。它只将级别为INFO或更高的日志消息(即WARNINGERRORCRITICAL)发送给处理程序进行处理。

我们创建一个StreamHandler,将日志信息发送到一个流中,如控制台或终端。它被用来输出日志信息以达到调试的目的。我们还为处理程序设置了级别。

我们这样做是因为当处理程序收到来自日志记录器的消息时,它将把这些消息与它的级别进行比较,并在发出之前过滤掉严重程度较低的消息。当我们有不同的处理程序时:

logger.setLevel(logging.INFO)
file_handler = logging.FileHandler()
file_handler.setLevel(logging.ERROR)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

由于日志记录器的级别被设置为INFO,它只向两个处理程序发送级别为INFO或更高的日志消息,但每个处理程序只处理达到或超过其指定日志级别的消息。

回到我们的主要例子,然后我们创建一个格式化器并将其添加到处理程序中。格式化器指定了日志消息的格式,包括时间戳、日志记录器名称、日志级别和消息。最后,我们将处理程序添加到日志记录器中"。

现在在代码中,需要调用set_logger,如下所示:

import logging
from set_logging import set_logger
set_logger()
logger = logging.getLogger()
def roman_number(s: str) -> int:
    dic = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
    res = 0
    pre = None
    for char in s:
        res += dic.get(char)
        if dic.get(pre) and dic.get(pre) < dic.get(char):
            res -= 2 * dic.get(pre)
        pre = char
    logger.info("logging is awesome")
    return res
roman_number("IV")

运行这段代码,结果如下:

2023-03-04 02:26:57,619 - root - INFO - logging is awesome

三、使用日志的优点

  • 级别。一个日志记录器提供了一种方法来为不同类型的消息设置不同的日志级别,如DEBUGINFOWARNINGERRORCRITICALrrreee

    Um den Code zu verdeutlichen, verwenden wir die Funktion getLogger, um eine Logger-Instanz zu erstellen und verwenden setLevel, um die Protokollebene festzulegen ( DEBUG, INFO usw.). Die setLevel-Methode des Loggers fungiert wie ein Filter, der bestimmt, ob eine Protokollnachricht verarbeitet und an den Handler gesendet werden soll. Wenn wir beispielsweise die Stufe des Loggers auf INFO setzen, sendet der Logger keine Nachrichten mit der Stufe DEBUG an den Handler, da deren Schweregrad niedriger als die festgelegte Mindeststufe ist der Holzfäller. Es werden nur Protokollmeldungen der Stufe INFO oder höher (also WARNING, ERROR oder CRITICAL) gesendet Handler für die Verarbeitung.
  • Wir erstellen einen StreamHandler, um Protokollinformationen an einen Stream, beispielsweise eine Konsole oder ein Terminal, zu senden. Es dient zur Ausgabe von Protokollinformationen zu Debugging-Zwecken. Wir legen auch die Ebene für den Handler fest.

    Wir tun dies, weil der Handler, wenn er Nachrichten vom Logger empfängt, diese Nachrichten mit seiner Ebene vergleicht und Nachrichten mit geringerem Schweregrad vor der Ausgabe herausfiltert. Wenn wir verschiedene Handler haben:

  • logger.setLevel(logging.INFO)
  • file_handler = logging.FileHandler()

    file_handler.setLevel(logging.ERROR)console_handler = logging.StreamHandler()console_handler.setLevel( logging.WARNING )

  • Da die Ebene des Loggers auf INFO eingestellt ist, sendet er nur Protokollnachrichten mit der Ebene INFO oder höher an beide Handler. Jeder Handler verarbeitet jedoch nur Nachrichten, die oder erfüllen die angegebene Protokollstufe überschreiten.

    Zurück zu unserem Hauptbeispiel: Anschließend erstellen wir einen Formatierer und fügen ihn dem Handler hinzu. Der Formatierer gibt das Format der Protokollnachricht an, einschließlich Zeitstempel, Loggername, Protokollebene und Nachricht. Schließlich fügen wir den Handler zum Logger hinzu.

    Jetzt müssen wir im Code set_logger aufrufen, wie unten gezeigt:
  • rrreee
Führen Sie diesen Code aus und das Ergebnis sieht wie folgt aus: 🎜🎜 🎜 04.03.2023 02:26:57,619 - root - INFO - Protokollierung ist großartig🎜🎜🎜 3. Vorteile der Verwendung von Protokollen🎜
    🎜🎜🎜level🎜 Ein Logger bietet eine Methode zum Festlegen unterschiedlicher Protokollebenen für verschiedene Arten von Nachrichten, z. B. DEBUG, INFO, WARNING, ERROR und KRITISCH Dies erleichtert das Filtern und Priorisieren von Protokollmeldungen basierend auf ihrem Schweregrad. Natürlich kann das Drucken das gleiche Verhalten nachahmen wie die Protokollierung, aber es erfordert mehr Hardcoding und ist nicht so flexibel wie die Protokollierung . 🎜🎜🎜🎜🎜Das Drucken von Protokollinformationen kann langsamer sein als die Verwendung eines Loggers, insbesondere bei der Verarbeitung großer Datenmengen oder der häufigen Protokollierung. 🎜Logger bieten eine Möglichkeit, das Protokollierungsverhalten zu konfigurieren B. Protokollebenen, Protokollziele und Protokollformate, ohne den Quellcode zu ändern. Dies erleichtert die Verwaltung und Pflege des Protokollierungsverhaltens im Laufe der Zeit. Durch die Flexibilität können Sie Protokollinformationen an mehrere Ziele senden , Datei oder Datenbank Diese Flexibilität erleichtert die Verwaltung und Analyse von Protokollen.

Das obige ist der detaillierte Inhalt vonSo debuggen Sie den Code des Protokollierungsmoduls in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen