web-dev-qa-db-fra.com

logging setLevel, comment cela fonctionne

Dans la documentation de la journalisation il y a cet exemple:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

Pourquoi devrais-je régler le niveau sur logging.DEBUG Deux fois, pour Logger et pour StreamHandler?

Je comprends que ch.setLevel(logging.DEBUG) définira le niveau de débogage pour le gestionnaire de flux. Mais quel est l'effet du réglage du niveau sur l'enregistreur? Où ce niveau se reflète-t-il?

J'obtiens la même sortie de console si je change le niveau en, par exemple, INFO soit en Logger ou en StreamHandler.

C'est:

...........
logger.setLevel(logging.INFO)
............
ch.setLevel(logging.DEBUG)

donne la même sortie dans la console que

...........
logger.setLevel(logging.DEBUG)
............
ch.setLevel(logging.INFO)
35
joaquin

Il est là pour un réglage fin (vous pouvez avoir plusieurs gestionnaires, et chacun peut avoir différents niveaux définis) - vous ne pouvez pas définir le niveau en toute sécurité sur le gestionnaire, ce qui entraînera le traitement de tous les messages (alias niveau NOTSET), et laissera le filtrage de niveau à l'enregistreur.

L'enregistreur est également le premier à filtrer le message en fonction d'un niveau - si vous définissez l'enregistreur sur INFO et tous les gestionnaires sur DEBUG, vous ne recevrez toujours pas de messages DEBUG sur les gestionnaires - ils seront rejetés par l'enregistreur lui-même. Si vous définissez l'enregistreur sur DEBUG, mais tous les gestionnaires sur INFO, vous ne recevrez pas non plus de messages DEBUG - car alors que l'enregistreur dit "ok, traitez ceci", les gestionnaires le rejettent (DEBUG <INFO).

40
Cat Plus Plus

Pourquoi devrais-je définir le niveau à logging.DEBUG deux fois, pour l'enregistreur et pour le gestionnaire de flux. Je comprends que ch.setLevel (logging.DEBUG) définira le niveau de débogage pour le gestionnaire de flux. Mais quel est l'effet du réglage du niveau sur l'enregistreur?. Où se reflète ce niveau?.

Ceci est indiqué dans la documentation:

"La méthode setLevel (), tout comme dans les objets logger, spécifie la gravité la plus faible qui sera envoyée à la destination appropriée. Pourquoi existe-t-il deux méthodes setLevel ()? Le niveau défini dans le logger détermine la gravité des messages qu'il transmettra à ses gestionnaires. Le niveau défini dans chaque gestionnaire détermine les messages que ce gestionnaire enverra. "

Vérifiez sous Gestionnaires: http://docs.python.org/2.7/howto/logging.html#logging-advanced-tutorial

3
Ankur Agarwal

Je pense qu'il est utile de considérer ces trois points principaux pour comprendre comment fonctionne la journalisation:

  • Vous pouvez créer une hiérarchie d'objets Logger. Chacun d'eux n'aura initialement aucun niveau défini (niveau NOTSET). Le niveau effectif d'un objet Logger est le premier niveau qui a a été défini dans la hiérarchie sur le chemin jusqu'à l'enregistreur racine (éventuellement NOTSET, si aucun niveau n'a été défini ).

  • Le niveau effectif d'un enregistreur est uniquement utilisé pour déterminer s'il faut commencer une action avec le message directement émis vers cet enregistreur.

  • Cette action consiste, en premier lieu, à transmettre le message à que les gestionnaires de l'enregistreur, et ensuite (en fonction de la valeur de l'indicateur propager), à le transmettre à chacun des gestionnaires du chaîne d'ancêtres au sommet, sans tenir compte des niveaux réels de chacun des bûcherons de la chaîne.

Pour répondre à votre question, vous n'avez pas besoin de la définir deux fois dans cet exemple. Le définir sur DEBUG uniquement dans le Logger sera suffisant pour permettre aux messages de log envoyés directement à votre instance de Logger de se rendre à la console (puisque le niveau par défaut dans un nouveau StreamHandler est NOTSET par défaut, il laissera donc tout passer).

2
brAzzi64