web-dev-qa-db-fra.com

python logging s'assure qu'un gestionnaire n'est ajouté qu'une seule fois

J'ai un morceau de code qui initialise un enregistreur comme ci-dessous.

logger = logging.getLogger()
hdlr = logging.FileHandler('logfile.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr) 
logger.setLevel(logging.DEBUG)

Malheureusement, ce code est appelé plusieurs fois, existe-t-il un moyen de vérifier si le gestionnaire existe déjà - je préférerais l'implémenter sans avoir à utiliser un Singleton.

EDIT: Désolé, j'ai oublié de mentionner que c'est sur python 2.5 - cheers, Richard

46

Eh bien, le logger.addHandler () n'ajoutera pas de gestionnaire s'il existe déjà. Pour vérifier si le gestionnaire est déjà là, vous pouvez consulter la liste logger.handlers:

logger = logging.getLogger()
hdlr = logging.FileHandler('logfile.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr) 
logger.setLevel(logging.DEBUG)
print logger.handlers
# [<logging.FileHandler object at 0x14542d0>]
logger.addHandler(hdlr)
print logger.handlers
# [<logging.FileHandler object at 0x14542d0>]

En plus de cela, je vous suggérerai de mettre ce code dans votre fonction main () si vous en avez une ou dans le __init__.py fichier de votre package pour ne pas avoir à l'appeler à chaque fois. Je vous suggérerai également d'utiliser un enregistreur nommé et de ne pas utiliser l'enregistreur racine. Quelque chose comme ça:

logger = logging.getLogger(__name__)
...

J'espère que cela vous a été utile :)

15
mouad

Vous pouvez également vérifier simplement si la liste des gestionnaires est vide. Voici la solution avec laquelle je me suis retrouvé:

def setup_logging(self, logfile):
    self._logger = logging.getLogger('TestSuite')
    self._logger.setLevel(logging.INFO)
    Host = socket.gethostname().split('.')[0]
    if self._logger.handlers == []:
        fh = logging.handlers.RotatingFileHandler(logfile,
                                                  maxBytes=10*1024*1024,
                                                  backupCount=5)
        strfmt = "%" + "(asctime)s [%s] " % Host + "%" + "(message)s"
        fmt = logging.Formatter(strfmt, datefmt="%Y.%m%d %H:%M:%S")
        fh.setFormatter(fmt)

        self._logger.addHandler(fh)
    self._logger.info('-' * (55 - len(Host)))

Je voyais le gestionnaire ajouté plusieurs fois, donc chaque message de journal était écrit plusieurs fois dans le fichier journal, et cela a été corrigé.

4
Tom Barron

Essayez de vérifier si logger est déjà défini. Par exemple, si ce code se trouve dans une fonction:

logger = None
def init_logger():
    global logger
    if logger is not None:
        #logger has already been initialized
        return
    logger = logging.getLogger()
    hdlr = logging.FileHandler('logfile.log')
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr) 
    logger.setLevel(logging.DEBUG)
1
multipleinterfaces