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
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.
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')
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')