Je développe une application Django et j'essaie d'utiliser le module de journalisation de Python pour la journalisation des erreurs et des traces. Idéalement, j'aimerais avoir différents loggers configurés pour différentes zones du site. Jusqu'à présent, j'ai réussi à faire fonctionner tout cela, mais il y a une chose qui me laisse perplexe.
J'ai le journal Root qui va vers sys.stderr, et j'ai configuré un autre journal pour écrire dans un fichier. Ceci est dans mon fichier settings.py :
sviewlog = logging.getLogger('MyApp.views.scans')
view_log_handler = logging.FileHandler('C:\\MyApp\\logs\\scan_log.log')
view_log_handler.setLevel(logging.INFO)
view_log_handler.setFormatter(logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s'))
sviewlog.addHandler(view_log_handler)
Cela semble assez simple. Mais voici le problème : tout ce que j'écris dans le sviewlog est écrit deux fois dans le fichier journal. Le logger Root ne l'imprime qu'une fois. C'est comme si addHandler() était appelé deux fois. Et lorsque je passe mon code dans un débogueur, c'est exactement ce que je vois. Le code dans settings.py est exécuté deux fois, donc deux FileHandlers sont créés et ajoutés à la même instance de logger. Mais pourquoi ? Et comment puis-je contourner ce problème ?
Quelqu'un peut-il me dire ce qui se passe ici ? J'ai essayé de déplacer le code d'instanciation du logger/handler sviewlog dans le fichier où il est utilisé (puisque cela me semble être l'endroit approprié), mais j'ai le même problème. La plupart des exemples que j'ai vus en ligne n'utilisent que le logger Root, et je préférerais avoir plusieurs loggers.