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)