TL;DR: If you use the default example your handlers are duplicated in each object instance
If you blindly follow the official python documentation at https://docs.python.org/3/howto/logging.html
you will probably end up with duplicate lines like me. The reason for this is, that each instance of your object will add a separate handler to the default logger. You will stumble upon code like this:
logger = logging.getLogger() handler = logging.StreamHandler() formatter = logging.Formatter( '%(asctime)s %(name)-12s %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.handlers logger.addHandler(handler) logger.setLevel(logging.DEBUG)
The easiest fix is to just add the handlers if they haven’t been added before. You can just copy & paste this in your __init__ function:
logger = logging.getLogger() if not logger.handlers: handler = logging.StreamHandler() formatter = logging.Formatter( '%(asctime)s %(name)-12s %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.handlers logger.addHandler(handler) logger.setLevel(logging.DEBUG)