Maison  >  Article  >  développement back-end  >  Comment déboguer le code du module de journalisation en Python

Comment déboguer le code du module de journalisation en Python

WBOY
WBOYavant
2023-05-10 16:31:061095parcourir

1. Hiérarchie des journaux

Avant de commencer, il convient de noter qu'il existe une structure hiérarchique dans la journalisation, appelée arborescence des journaux ou hiérarchie des loggers. La hiérarchie se compose de plusieurs niveaux, chaque niveau représentant une gravité différente des informations de journal. Les niveaux les plus courants sont :

CRITICAL #Une erreur critique s'est produite, le programme peut ne pas pouvoir continuer à s'exécuter.
ERROR #Une erreur s'est produite qui doit faire l'objet d'une enquête.# 🎜🎜#AVERTISSEMENT #Une indication que quelque chose d'inattendu s'est produit ou un problème dans un avenir proche.
INFO

2. Créez un module

Créons un module python nommé set_logging.py :

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)

For Pour clarifier le code, nous utilisons la fonction getLogger pour créer une instance de logger, et utilisons setLevel pour définir le niveau de journalisation (DEBUG, INFO code>etc.). La méthode setLevel du logger agit comme un filtre, qui détermine si un message de journal doit être traité et envoyé au gestionnaire. Par exemple, si nous définissons le niveau de l'enregistreur sur INFO, alors l'enregistreur n'enverra pas de messages avec un niveau DEBUG au gestionnaire en raison de leur gravité inférieure au niveau minimum défini sur l'enregistreur. Il envoie uniquement des messages de journal de niveau INFO ou supérieur (c'est-à-dire WARNING, ERROR ou CRITICAL) à gestionnaire pour le traitement.

set_logging.py的python模块:

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")

为了明确代码,我们用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,如下所示:

rrreee

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

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

三、使用日志的优点

  • 级别。一个日志记录器提供了一种方法来为不同类型的消息设置不同的日志级别,如DEBUGINFOWARNINGERRORCRITICALNous créons un StreamHandler pour envoyer les informations de journal à un flux, tel qu'une console ou un terminal. Il est utilisé pour générer des informations de journal à des fins de débogage. Nous définissons également le niveau du gestionnaire.

  • Nous faisons cela parce que lorsque le gestionnaire reçoit des messages de l'enregistreur, il comparera ces messages à son niveau et filtrera les messages les moins graves avant de les émettre. Quand nous avons différents gestionnaires :
  • logger.setLevel(logging.INFO)file_handler = logging.FileHandler()

    file_handler.setLevel(logging. ERROR)# 🎜🎜#console_handler = logging.StreamHandler()
  • console_handler.setLevel(logging.WARNING)
  • Puisque le niveau de l'enregistreur est défini sur INFO , qui envoie uniquement des messages de journal de niveau INFO ou supérieur aux deux gestionnaires, mais chaque gestionnaire ne gère que les messages qui atteignent ou dépassent son niveau de journalisation spécifié.

    Retour à notre exemple principal, nous créons ensuite un formateur et l'ajoutons au gestionnaire. Le formateur spécifie le format du message de journal, y compris l'horodatage, le nom de l'enregistreur, le niveau de journalisation et le message. Enfin, on ajoute le handler au logger." #Exécutez ce code, le résultat est le suivant :
  • 2023-03-04 02:26:57,619 - root - INFO - logging est génial#🎜🎜 #三、Avantages de l'utilisation des journaux

    #🎜🎜#Level# 🎜🎜# Un enregistreur fournit une méthode pour définir différents niveaux de journalisation pour différents types de messages, tels que DEBUG, INFO, WARNING, ERROR et CRITICAL. Cela facilite le filtrage et la priorisation des messages de journal en fonction de leur gravité. Bien sûr, l'impression peut imiter le même comportement que la journalisation, mais cela nécessite plus de travail de codage. . Pas aussi flexible que la journalisation #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Performance#🎜🎜# L'impression des informations de journalisation peut être plus lente que l'utilisation d'un enregistreur, en particulier lors du traitement de grandes quantités de données. ou fréquemment lors de la connexion. #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Configurabilité#🎜🎜# Les enregistreurs fournissent un moyen de configurer le comportement de journalisation d'une application, les destinations de journalisation et. formats de journaux sans modifier le code source, ce qui facilite la gestion et le maintien du comportement de journalisation au fil du temps. #Flexibilité#🎜🎜# Le logger vous permet d'envoyer des messages de journal à plusieurs destinations telles que la console, le fichier ou la base de données. et les analyser #🎜🎜## 🎜🎜##🎜🎜#

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer