gwift-book/source/part-2-deployment/logging.adoc

2.9 KiB
Raw Blame History

Logging

La structure des niveaux de journaux est essentielle.

When deciding whether a message should be ERROR or WARN, imagine being woken up at 4 a.m. Low printer toner is not an ERROR.
— Dan North
former ToughtWorks consultant
  • DEBUG: Il sagit des informations qui concernent tout ce qui peut se passer durant lexécution de lapplication. Généralement, ce niveau est désactivé pour une application qui passe en production, sauf sil est nécessaire disoler un comportement en particulier, auquel cas il suffit de le réactiver temporairement.

  • INFO: Enregistre les actions pilotées par un utilisateur - Démarrage de la transaction de paiement, …​

  • WARN: Regroupe les informations qui pourraient potentiellement devenir des erreurs.

  • ERROR: Indique les informations internes - Erreur lors de lappel dune API, erreur interne, …​

  • FATAL (ou EXCEPTION): …​ généralement suivie dune terminaison du programme ;-) - Bind raté dun socket, etc.

La configuration des loggers est relativement simple, un peu plus complexe si nous nous penchons dessus, et franchement complète si nous creusons encore. Il est ainsi possible de définir des formattages, gestionnaires (handlers) et loggers distincts, en fonction de nos applications.

Sauf que comme nous lavons vu avec les 12 facteurs, nous devons traiter les informations de notre application comme un flux dévènements. Il nest donc pas réellement nécessaire de chipoter la configuration, puisque la seule classe qui va réellement nous intéresser concerne les StreamHandler. La configuration que nous allons utiliser est celle-ci:

  1. Formattage: à définir - mais la variante suivante est complète, lisible et pratique: {levelname} {asctime} {module} {process:d} {thread:d} {message}

  2. Handler: juste un, qui définit un StreamHandler

  3. Logger: pour celui-ci, nous avons besoin dun niveau (level) et de savoir sil faut propager les informations vers les sous-paquets, auquel cas il nous suffira de fixer la valeur de propagate à True.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
        },
        'simple': {
            'format': '{levelname} {asctime} {module} {message}',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': "verbose"
        }
    },
    'loggers': {
        'khana': {
            'handlers': ['console'],
            'level': env("LOG_LEVEL", default="DEBUG"),
            'propagate': True,
        },
    }
}

Pour utiliser nos loggers, il suffit de copier le petit bout de code suivant:

import logging

logger = logging.getLogger(__name__)

logger.debug('helloworld')