27 votes

Python logging seulement le log de script

J'utilise le module de journalisation Python dans un simple script avec la configuration suivante pour le moment.

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(__name__)

Mon problème est que cela permet également de capturer des modules tiers comme les demandes et de produire des messages de journal info() à partir de ceux-ci. Existe-t-il un moyen de supprimer ces messages ou de dire au module d'enregistrement de ne consigner que les messages de mon propre script ?

35voto

user136036 Points 101

La réponse ci-dessus n'est pas vraiment correcte - elle ne fera que placer la barre plus haut pour que les messages des autres modules soient affichés.

Une approche très rapide serait d'utiliser ce morceau de code :

import logging.config
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': True,
})

Vous devez définir ce paramètre après avoir importé tous les modules - cela désactivera tous les enregistreurs qui ont été créés jusqu'à ce point. Cela fonctionnera la plupart du temps, mais certains modules créent leur logger lorsque vous créez une instance de classe par exemple (ce qui se produirait plus tard dans votre code).


Lorsque vous configurez les enregistreurs selon le tutoriel de base de python, ils vous disent d'utiliser logging.basicConfig(...) . Cela pose un problème car le gestionnaire (c'est-à-dire l'endroit où le journal sera acheminé) sera défini comme suit logging.lastResort qui est stderr à partir de Python 3.2 pour tous dans le processus. Cela signifie que vous avez maintenant activé la journalisation complète pour tous les modules.

Une meilleure approche consiste donc à créer un enregistreur différent uniquement pour vos modules et à lui donner ses propres gestionnaires, au lieu d'utiliser la fonction basicConfig() .

Il y a deux façons de le faire :

1) Toutes les fonctions :

import logging

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
                          datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)

Cela vous donnera le logger log que vous pouvez ensuite utiliser comme log.error("Error found") . Il écrira dans un nouveau fichier appelé mylog.log et enregistrera également dans sys.stdout. Vous pouvez bien sûr modifier ces paramètres comme vous le souhaitez.

2) Utiliser un dictateur :

import logging
import logging.config

DEFAULT_LOGGING = {
    'version': 1,
    'formatters': { 
        'standard': {
            'format': '%(asctime)s %(levelname)s: %(message)s',
            'datefmt': '%Y-%m-%d - %H:%M:%S' },
    },
    'handlers': {
        'console':  {'class': 'logging.StreamHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'stream': sys.stdout},
        'file':     {'class': 'logging.FileHandler', 
                     'formatter': "standard", 
                     'level': 'DEBUG', 
                     'filename': 'live_detector.log','mode': 'w'} 
    },
    'loggers': { 
        __name__:   {'level': 'INFO', 
                     'handlers': ['console', 'file'], 
                     'propagate': False },
    }
}

logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)

Cela donnera le même résultat que le précédent, un peu plus long, mais peut-être plus facile à lire. Cela mettra aussi automatiquement 'disable_existing_loggers': True . Si vous ne voulez pas cela, vous devez l'ajouter et le définir sur False.

23voto

Thomas Jung Points 17692

Utiliser des enregistreurs nommés dans vos modules :

import logging
logger = logging.getLogger(__name__)
logger.info("my info")
logger.error("my error")

vous pouvez définir le niveau d'enregistrement pour tous les autres enregistreurs sur erreur et pour vos enregistreurs sur débogage :

import logging
logging.basicConfig(level=logging.ERROR)
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X