Summary
I have a complex_function()
that emits logs that I would like to view in a st.text_area
.
Steps to reproduce
Code snippet:
import logging
class StreamlitHandler(logging.Handler):
def __init__(self):
super(StreamlitHandler, self).__init__()
def emit(self, record):
new_log = self.format(record) + '\n'
if 'log_data' not in st.session_state:
st.session_state.log_data = ""
st.session_state.log_data += new_log
import streamlit as st
import logging
import time
# Define a complex function that uses logging
def complex_function():
logger = logging.getLogger(__name__)
for i in range(5):
logger.info(f'Processing {i}')
time.sleep(1) # simulate some processing time
# Setup streamlit UI
st.title("Display Logger in Streamlit")
# Setup logger
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
handler = StreamlitHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
if st.button('Run Complex Function'):
complex_function()
# Display the logs
st.text_area("Logs", value=st.session_state.get('log_data', ''), height=200, key="log_area")
Expected behavior:
The expected behavior would be to get a text_area that gets updated every second with
2023-08-09 01:37:08.046 Processing 0
2023-08-09 01:37:09.051 Processing 1
2023-08-09 01:37:10.057 Processing 2
2023-08-09 01:37:11.061 Processing 3
2023-08-09 01:37:12.068 Processing 4
Actual behavior:
I get duplicated log messages, all showing up at once (after 4s) and greyed out duplicates of other streamlit components which disappear after the execution.
Debug info
- Streamlit version: (get it with
$ streamlit version
) - Python version: Streamlit, version 1.17.0
- Using PipEnv
- OS version: MacOS
- Browser version: Version 115.0.5790.170 (Official Build) (arm64)