Table des matières

Les logs en Python

La bibliothèque standard python intègre un module simple et flexible pour générer ses logs.

Lorsqu'on utilise directement les fonctions au niveau du module, on utilise en fait le logger par défaut root qui est configuré pour écrire sur la sortie erreur standard.

>>> import logging
 
>>>  type(logging.root)
logging.RootLogger

Modifier le niveau de log

Les niveaux disponibles: logging.DEBUG < logging.INFO < logging.WARN < logging.ERROR < logging.CRITICAL

Les messages dont le niveau est inférieur à celui configuré pour le logger ne seront pas pris en compte. Par défaut le root logger est configuré sur logging.WARN

>>> logging.info('Test module logging')
 
>>> logging.error('division par 0 impossible')
ERROR:root:division par 0 impossible
 
>>> logging.root.setLevel(logging.INFO)
 
>>> logging.info('Test module logging')
INFO:root:Test module logging

Dans l'exemple ci dessus, après avoir modifié le niveau du logger root, le message de niveau logging.INFO est bien écrit sur la sortie standard.

Remplacer le logger par défaut

Le logger par défaut (root) créé par le module peut être remplacé. Utiliser la fonction logging.getLogger('nom_logger') pour obtenir une référence vers un nouvel objet logger ou un logger déjà existant.

Remarque: Lors de sa création, le logger ne possède pas de controleur. Il faudra en instancier au moins un pour que le logger puisse fonctionner. Utiliser la méthode addHandler() pour lier un contrôleur à l'instance courante.

Les contrôleurs (Handlers) sont disponible dans le module logging.handlers. On notera:

StreamHandler() sortie erreur standard
FileHandler() sortie dans un fichier
SMTPHandler() envoi de mail
# nouveau logger identifer par logger_perso
>>> mon_logger= logging.getLogger('logger_perso')
 
# On associe au moins un contrôleur
>>> mon_logger.addHandler(logging.StreamHandler())
 
# On définie le niveau minimum
>>> mon_logger.setLevel(logging.DEBUG)
 
 
>>> mon_logger.info('logging activé')
logging activé
INFO:logger_perso:logging activé

Depuis n'importe quelle partie du code, il sera possible de recupérer ce logger pour générer des messages:

def ma_fonction():
   # retrouver mon logger
   log= logging.getLogger('logger_perso')
   # générer le  message de log
   log.debug('execution de la fonction ma_fonction')

Exemple

import logging
 
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler that logs debug and higher level messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)
 
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

Références