Actually, it appears to only duplicate logs when I start the server initially. My guess is that it performs a refresh right at the start which would explain the duplication.
I wrote a create logger function that checks how many handlers are already present, and then also used session state to track if a logger had already been created. I think this is double overkill, but it worked for me!
def create_logger(name, level = 'DEBUG', file = None):
logger = logging.getLogger(name)
logger.propagate = False
logger.setLevel(level)
#if no streamhandler present, add one
if sum([isinstance(handler, logging.StreamHandler) for handler in logger.handlers]) == 0:
ch = logging.StreamHandler()
ch.setFormatter(logging.Formatter('%(asctime)s.%(msecs)03d-%(name)s-%(levelname)s>>>%(message)s', "%H:%M:%S"))
logger.addHandler(ch)
#if a file handler is requested, check for existence then add
if file is not None:
if sum([isinstance(handler, logging.FileHandler) for handler in logger.handlers]) == 0:
ch = logging.FileHandler(log_dir/file, 'w')
ch.setFormatter(logging.Formatter('%(asctime)s.%(msecs)03d-%(name)s-%(levelname)s>>>%(message)s', "%H:%M:%S"))
logger.addHandler(ch)
return logger
if 'logger' not in st.session_state:
st.session_state['logger'] = create_logger(name = 'app', level = 'DEBUG', file = 'app.log')
logger = st.session_state['logger']