web-dev-qa-db-fra.com

Définir les niveaux de journalisation

J'essaie d'utiliser la bibliothèque standard pour déboguer mon code:

Cela fonctionne bien:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('message')

Je ne peux pas faire fonctionner l'enregistreur pour les niveaux inférieurs:

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.info('message')

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.debug('message')

Je ne reçois aucune réponse pour ni l'un ni l'autre.

Qu'est-ce que Python? Cela a fonctionné pour moi dans la version 3.4. Notez cependant que basicConfig () n'affectera pas le gestionnaire racine s'il est déjà configuré:

Cette fonction ne fait rien si le logger racine a déjà des gestionnaires configurés pour elle.

Pour définir explicitement le niveau sur la racine, faites logging.getLogger().setLevel(logging.DEBUG). Mais assurez-vous que vous avez déjà appelé basicConfig() afin que le consignateur racine ait initialement une configuration. C'est à dire.:

import logging
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
logging.getLogger('foo').debug('bah')
logging.getLogger().setLevel(logging.INFO)
logging.getLogger('foo').debug('bah')

Notez également que les "enregistreurs" et leurs "gestionnaires" ont tous deux des niveaux de journalisation distincts. Donc, si vous avez déjà explicitement chargé une configuration de consignateur complexe en vous Python), et que cela a gâché le (s) gestionnaire (s) du consignateur racine, cela peut alors avoir un effet et changer le Les enregistreurs enregistrent le niveau de journalisation avec logging.getLogger().setLevel(..) risque de ne pas fonctionner, car le gestionnaire attaché peut avoir un niveau de journalisation défini indépendamment. Il est peu probable que ce soit le cas et ne vous préoccupez pas normalement.

37
spinkus

J'utilise la configuration suivante pour la journalisation

Configuration basée sur Yaml

Créez un fichier yaml appelé logging.yml comme ceci

version: 1

formatters:
    simple:
        format: "%(name)s - %(lineno)d -  %(message)s"

    complex:
        format: "%(asctime)s - %(name)s - %(lineno)d -  %(message)s"


handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple

    file:
        class: logging.handlers.TimedRotatingFileHandler
        when: midnight
        backupCount: 5
        level: DEBUG
        formatter: simple
        filename : Thrift.log

loggers:

    qsoWidget:
        level: INFO
        handlers: [console,file]
        propagate: yes

    __main__:   
        level: DEBUG
        handlers: [console]
        propagate: yes

Python - Le principal

Le module "principal" devrait ressembler à ceci

import logging.config
import logging

with open('logging.yaml','rt') as f:
        config=yaml.safe_load(f.read())
        f.close()
logging.config.dictConfig(config)
logger=logging.getLogger(__name__)
logger.info("Contest is starting")

Sous-modules/classes

Ceux-ci devraient commencer comme ça

import logging

class locator(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.logger.debug('{} initialized')

J'espère que ça vous aide ...

6
Tim Seed