Archives du mot-clé python

Librairie Logging : où comment écrire simplement des logs en Python

Cet article ne vous permettra pas d’être un expert de la librairie Python, mais vous pourrez écrire très simplement des logs dans votre code Python.

Côté Python : seulement 3 lignes !

#Les imports
import logging, logging.config

#Création de mon logger
logging.config.fileConfig('C:/le/chemin/vers/mon/fichier/de/config.ini')

#Récupération de mon logger
_logger = logging.getLogger(_name_)

#Maintenant je peux écrire des logs =)
_logger.error('Il fait froid ... ')

_logger.info('Normal on est au mois de décembre ! Boulet !')

Comme vous pouvez le constater, côté Python c’est très simple. Maintenant allons voir le fichier de configuration (‘config.ini’).

Côté fichier de configuration

Je choisi de n’utiliser qu’un seul logger (il est bien sûr possible de créer plusieurs logger). Mais pour faire simple, je crée un logger « root ».

[loggers]
keys=root
...

J’instancie mes Handlers. Ici je crée 2 Handlers : un premier écrivant mes logs dans la console et un second m’écrivant dans un fichier (je les définirai plus loin).

...
[handlers]
keys=fileHandler, consoleHandler
...

Je définis mes formats de logs. On peut créer plusieurs formats de logs (on vas les créer plus bas) (petite précision : un handler peut n’avoir qu’un seul format).

...
[formatters]
keys=simpleFormaters
...

Après avoir défini un logger, je le crée :

...
[logger_root]
level=DEBUG
handlers=fileHandler, consoleHandler
...

Création de mon premier Handler : il va écrire mes logs dans un fichier. Je choisis un RotatingFileHandler. Lorsqu’un fichier a atteint la taille maximal (maxBytes), un nouveau fichier est créé. la valeur « a » de l’attribut « args » permet de ne pas vider le fichier de log avant d’écrire dedans.

...
[handler_fileHandler]
class=logging.handlers.RotatingFileHandler
level=DEBUG
maxBytes=1000000
backupCount=20
encoding=utf8
formatter=simpleFormaters
args=('mon/fichier/de/log.logs', 'a')
...

Création de mon second Handler : il va écrire dans la console

...
[handler_consoleHandler]
class=StreamHandler
level=ERROR
formatter=simpleFormaters
args=(sys.stdout,)
...

Je définis mon format de logs.

...
[formatter_simpleFormaters]
format=%(asctime)s - %(module)s:%(lineno)s - %(levelname)s - %(message)s
datefmt=
...

Voici à quoi vont ressembler mes logs :

2013-12-20 09:00:00,000 - monModulePython.123 - ERROR - Il fait froid ...
2013-12-20 09:02:00,000 - monModulePython.123 - INFO- Normal on est au mois de décembre ! Boulet !

Voilà vous avez créé votre logger ! Il peut être appelé ainsi :

_logger = logging.getLogger(_name_)

Dans l’exemple du dessus, dans la console, seuls les logs de niveau ‘ERROR’ et ‘CRITICAL’ sont écrits. Au contraire du fichier où tous les logs sont écrits.

Petite explication sur les niveau de logs

Il existe plusieurs niveau de logs :

Niveau Valeur Usage
CRITICAL 50 Le programme complet est en train de partir en couille.
ERROR 40 Une opération a foirée.
WARNING 30 Pour avertir que quelque chose mérite l’attention : enclenchement d’un mode particulier, detection d’une situation rare, un lib optionelle peut être installée.
INFO 20 Pour informer de la marche du programme. Par exemple : “Starting CSV parsing”.
DEBUG 10 Pour dumper des information quand vous débuggez. Par exemple savoir ce qu’il y a dans ce putain de dictionnaire.

On définit un niveau à chaque logger ET à chaque handler. Par exemple :

  • Si le niveau du logger est supérieur au niveau du hadnler: le log est ignoré
  • Si le niveau du logger est inférieur ou égal au niveau du hadnler: le log est écrit
  • Si le niveau du handler (ou du logger) est supérieur au niveau du log: le log est ignoré
  • Si le niveau du handler (ou du logger) est inférieur ou égal au niveau du log : le log est écrit

Conclusion

Avec ce tuto, vous n’êtes pas un dieu du logging en Python, mais vous savez en faire.
Comme d’habitude il faut se référer à la documentation officielle pour plus de détails : içi