178 votes

Sortie de journal en double lors de l'utilisation du module de journalisation Python

J'utilise python logger. Voici mon code:

 import os
import time
import datetime
import logging
class Logger :
   def myLogger(self):
      logger = logging.getLogger('ProvisioningPython')
      logger.setLevel(logging.DEBUG)
      now = datetime.datetime.now()
      handler=logging.FileHandler('/root/credentials/Logs/ProvisioningPython'+ now.strftime("%Y-%m-%d") +'.log')
      formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
      handler.setFormatter(formatter)
      logger.addHandler(handler)
      return logger

Le problème que j'ai est que j'obtiens plusieurs entrées dans le fichier journal pour chaque appel logger.info Comment puis-je resoudre ceci?

141voto

Werner Smit Points 1571

Le logging.getLogger() renvoie la même instance pour un nom donné. ( Documentation )

Le problème est que chaque fois que vous appelez myLogger() , cela ajoute un autre gestionnaire à l'instance, ce qui provoque des journaux en double.

Peut-être quelque chose comme ça ?

 import os
import time
import datetime
import logging

loggers = {}

def myLogger(name):
    global loggers
    
    if loggers.get(name):
        return loggers.get(name)
    else:
        logger = logging.getLogger(name)
        logger.setLevel(logging.DEBUG)
        now = datetime.datetime.now()
        handler = logging.FileHandler(
            '/root/credentials/Logs/ProvisioningPython' 
            + now.strftime("%Y-%m-%d") 
            + '.log')
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        loggers[name] = logger
                       
        return logger

117voto

rm957377 Points 819

Depuis Python 3.2, vous pouvez simplement vérifier si les gestionnaires sont déjà présents et, si c'est le cas, les effacer avant d'ajouter de nouveaux gestionnaires. C'est assez pratique lors du débogage et le code inclut l'initialisation de votre enregistreur

 if (logger.hasHandlers()):
    logger.handlers.clear()

logger.addHandler(handler)

85voto

Mr. B. Points 2600

J'ai déjà utilisé le logger tant que singleton et vérifié if not len(logger.handlers) , mais j'ai toujours des doublons : c'était la sortie formatée, suivie de la sortie non formatée.

Solution dans mon cas : logger.propagate = False

Crédits à cette réponse et aux documents .

51voto

Guillaume Cisco Points 2321
import datetime
import logging
class Logger :
    def myLogger(self):
       logger=logging.getLogger('ProvisioningPython')
       if not len(logger.handlers):
          logger.setLevel(logging.DEBUG)
          now = datetime.datetime.now()
          handler=logging.FileHandler('/root/credentials/Logs/ProvisioningPython'+ now.strftime("%Y-%m-%d") +'.log')
          formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
          handler.setFormatter(formatter)
          logger.addHandler(handler)
        return logger

fait le tour pour moi

en utilisant python 2.7

11voto

Matt Joiner Points 29194

Vous appelez Logger.myLogger() plus d'une fois. Stockez l'instance de journalisation qu'il renvoie quelque part et réutilisez -la .

Sachez également que si vous vous connectez avant l'ajout d'un gestionnaire, un StreamHandler(sys.stderr) par défaut sera créé.

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