web-dev-qa-db-fra.com

Hiérarchie de journalisation vs enregistreur racine?

Quelque part dans les entrailles de mon code, j'ai quelque chose comme:

logger = logging.getLogger('debug0.x')

D'après ce que je comprends, cela devrait seulement répondre quand j'ai déjà fait quelque chose comme:

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG, name='debug0')

notez que nom a été défini comme debug. Cependant, j’ai découvert que si

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG)

sans le mot-clé name, puis l'enregistreur debug0.x défini ci-dessus réagit et écrit dans le fichier journal. Je pensais qu'il ne réagirait que dans le premier cas, lorsque le bûcheron aurait été nommé.

Je suis confus.

40
reckoner

Le module Python logging organise les enregistreurs dans une hiérarchie. Tous les enregistreurs sont des descendants de l'enregistreur racine. Chaque enregistreur transmet les messages de journal à son parent.

De nouveaux enregistreurs sont créés avec la fonction getLogger(). L'appel de fonction logging.getLogger('debug0.x') crée un enregistreur x qui est un enfant de debug0 Qui lui-même est un enfant de l'enregistreur racine. Lors de la connexion à cet enregistreur, il transmettra le message à son parent et son parent transmettra le message à l'enregistreur racine. Vous avez configuré l'enregistreur racine pour qu'il se connecte à un fichier à l'aide de la fonction basicConfig(), votre message finira donc là.

81
Sven Marnach

Si vous extrayez le code ou le document:

>>> print logging.basicConfig.__doc__

    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured. ...............
    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.

logging.basicConfig n'utilise pas du tout l'argument nom. Il initialise l'enregistreur racine. Alors que getLogger prend un argument "nom"

>>> print logging.getLogger.__doc__

    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
13
pyfunc