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.
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('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler)
为了明确代码,我们用getLogger
函数创建一个日志器实例,并使用setLevel
来设置日志级别(DEBUG
、INFO
等)。日志器的setLevel
方法就像一个过滤器,它决定了一条日志信息是否应该被处理并发送给处理程序。例如,如果我们将日志记录器的级别设置为INFO
,那么日志记录器就不会向处理程序发送级别为DEBUG
的消息,因为它们的严重程度低于在日志记录器上设置的最低级别。它只将级别为INFO
或更高的日志消息(即WARNING
、ERROR
或CRITICAL
)发送给处理程序进行处理。
我们创建一个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
级别。一个日志记录器提供了一种方法来为不同类型的消息设置不同的日志级别,如DEBUG
、INFO
、WARNING
、ERROR
和CRITICAL
rrreee
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. 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:
file_handler.setLevel(logging.ERROR)console_handler = logging.StreamHandler()console_handler.setLevel( logging.WARNING )
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 Codeset_logger
aufrufen, wie unten gezeigt: 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!