Guide du module logging en Python

Lors du développement, il est fréquent d'avoir besoin d'afficher des informations pour faciliter le débogage. Cependant, utiliser trop de print() n'est pas idéal. Le module logging de Python offre une solution beaucoup plus élégante.

Le module logging propose deux types de gestionnaire (handler) principaux :

Le StreamHandler redirige les informations de journalisation vers la console. Le FileHandler écrit les informations dans un fichier. Ces gestionnaires peuvent être combinés pour une sortie multiple.

Effacer les données à chaque exécution

import logging


class GestionnaireJournaux:
    def __init__(self, chemin_fichier):
        self.chemin_fichier = chemin_fichier
        self.journal = logging.getLogger("app_logger")

    def configurer(self):
        self.journal.setLevel(logging.INFO)
        
        gestionnaire_fichier = logging.FileHandler(self.chemin_fichier)
        gestionnaire_fichier.setLevel(logging.DEBUG)

        format_journal = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        gestionnaire_fichier.setFormatter(format_journal)

        self.journal.addHandler(gestionnaire_fichier)

        return self.journal

    def effacer_contenu(self):
        with open(self.chemin_fichier, 'w') as fichier:
            fichier.truncate()

Utilisation :

from testcode import utilJournal

fichier_sortie = 'journal.log'

journal = utilJournal.GestionnaireJournaux(fichier_sortie).configurer()
utilJournal.GestionnaireJournaux(fichier_sortie).effacer_contenu()

journal.debug('Message de débogage')
journal.info('Message d'information')
journal.warning('Avertissement')
journal.error('Erreur détectée')
journal.critical('Erreur critique')

Résultat :

Un fichier .log sera généré dans le répertoire courant.

Points importants :

  • Il est recommandé de définir un niveau de journalisation approprié : NOTSET, DEBUG, INFO, WARNING, ERROR ou CRITICAL. Cela permet de contrôler la quantité d'informations affichées.
  • Plusieurs gestionnaires peuvent être ajoutés simultanément pour rediriger les journaux vers différents endroits.
  • Les chaînes de formatage peuvent être personnalisées selon les besoins.

Filtrage des messages :

class FiltreMotCle(logging.Filter):
    def filter(self, enregistrement):
        return 'erreur' in enregistrement.getMessage()

filtre_perso = FiltreMotCle()
gestionnaire_console.addFilter(filtre_perso)
            

Créer un fichier à chaque exécution

# -*- coding: utf-8 -*-
import logging
import time


class CreateurJournal:

    def __init__(self, nom_logger):
        self.journal = logging.getLogger(nom_logger)
        self.journal.setLevel(logging.DEBUG)

        horodatage = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
        repertoire = '../journal/'
        nom_fichier = repertoire + horodatage + '.log'
        
        handler_fichier = logging.FileHandler(nom_fichier)
        handler_fichier.setLevel(logging.INFO)

        handler_console = logging.StreamHandler()
        handler_console.setLevel(logging.INFO)

        format_journal = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler_fichier.setFormatter(format_journal)
        handler_console.setFormatter(format_journal)

        self.journal.addHandler(handler_fichier)
        self.journal.addHandler(handler_console)

    def obtenir_journal(self):
        return self.journal

Étiquettes: Python logging debugging file-handling streamhandler

Publié le 6 juin à 00h17