217 votes

Comment désactiver et réactiver la journalisation de la console en Python?

J'utilise le module de journalisation Python et je souhaite désactiver la journalisation de la console pendant un certain temps, mais cela ne fonctionne pas.

 
  #!/usr/bin/python
  import logging

  logger = logging.getLogger() # this gets the root logger
  # ... here I add my own handlers 
  #logger.removeHandler(sys.stdout)
  #logger.removeHandler(sys.stderr)

  print logging.handlers 
  # this will print [<logging.StreamHandler instance at ...>]
  # but I may have other handlers there that I want to keep

  logger.debug("bla bla")
 

Le code ci-dessus affiche le "bla bla" sur stdout et je ne sais pas comment désactiver en toute sécurité le gestionnaire de console. Comment puis-je m'assurer que j'enlève temporairement le gestionnaire de flux de la console et pas un autre?

242voto

sorin Points 23747

J'ai trouvé une solution pour cela:

 logger = logging.getLogger('my-logger')
logger.propagate = False
# now if you use logger it will not log to console.
 

Cela évitera que la journalisation soit envoyée au logger supérieur qui inclut la journalisation de la console.

150voto

infinito Points 402

J'utilise:

 logger = logging.getLogger()
logger.disabled = True
... whatever you want ...
logger.disabled = False
 

83voto

Vadikus Points 431

Vous pouvez utiliser:

logging.basicConfig(level=your_level)

your_level est l'une de celles-ci:

      'debug': logging.DEBUG,
      'info': logging.INFO,
      'warning': logging.WARNING,
      'error': logging.ERROR,
      'critical': logging.CRITICAL

Donc, si vous mettez your_level à l'exploitation forestière.CRITIQUE, vous obtiendrez seulement essentiel les messages envoyés par:

logging.critical('This is a critical error message')

Réglage your_level à l'exploitation forestière.DEBUG montrera tous les niveaux de l'exploitation forestière.

Pour plus de détails, veuillez jeter un oeil à la journalisation des exemples.

De la même manière pour changer de niveau pour chaque Gestionnaire d'utilisation du Gestionnaire.setLevel() fonction.

import logging
import logging.handlers

LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'

# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
          LOG_FILENAME, maxBytes=20, backupCount=5)

handler.setLevel(logging.CRITICAL)

my_logger.addHandler(handler)

50voto

l82ky Points 111

(question morte depuis longtemps, mais pour les futurs chercheurs)

Plus proche du code / de l’intention de l’affiche originale, cela fonctionne pour moi sous Python 2.6.

 #!/usr/bin/python
import logging

logger = logging.getLogger() # this gets the root logger

lhStdout = logger.handlers[0]  # stdout is the only handler initially

# ... here I add my own handlers 
f = open("/tmp/debug","w")          # example handler
lh = logging.StreamHandler(f)
logger.addHandler(lh)

logger.removeHandler(lhStdout)

logger.debug("bla bla")
 

Le truc que je devais trouver était de supprimer le gestionnaire stdout après en avoir ajouté un nouveau; le code de l'enregistreur apparaît pour rajouter automatiquement le stdout si aucun gestionnaire n'est présent.

28voto

andrea_crotti Points 961

Il y a quelques très belles réponses ici, mais apparemment, le plus simple est de ne pas trop pris en compte (uniquement à partir de infinito).

root_logger = logging.getLogger()
root_logger.disabled = True

Ceci désactive la racine de l'enregistreur, et donc de toutes les autres bûcherons. Je n'ai pas vraiment testé mais cela devrait être aussi le plus rapide.

À partir de la journalisation de code en python 2.7, je vois ce

def handle(self, record):
    """
    Call the handlers for the specified record.

    This method is used for unpickled records received from a socket, as
    well as those created locally. Logger-level filtering is applied.
    """
    if (not self.disabled) and self.filter(record):
        self.callHandlers(record)

Ce qui signifie que lorsqu'il est désactivé, aucun gestionnaire est appelé, et elle devrait être plus efficace que le filtrage d'une très haute valeur ou le réglage d'un no-op gestionnaire par exemple.

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