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
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 :)
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é.
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)