import logging import request import streamlit as st from streamlit import runtime from streamlit.runtime.scriptrunner import get_script_run_ctx # def get_remote_ip() -> str: # """Get remote ip.""" # try: # ctx = get_script_run_ctx() # if ctx is None: # return None # session_info = runtime.get_instance().get_client(ctx.session_id) # if session_info is None: # return None # except Exception as e: # return None # return session_info.request.remote_ip def get_remote_ip(): try: ip = requests.get('https://api64.ipify.org').text return ip except Exception as e: st.error(f"Unable to get IP address: {e}") return None class ContextFilter(logging.Filter): def filter(self, record): record.user_ip = get_remote_ip() return super().filter(record) def init_logging(): # Make sure to instanciate the logger only once # otherwise, it will create a StreamHandler at every run # and duplicate the messages # create a custom logger logger = logging.getLogger("foobar") if logger.handlers: # logger is already setup, don't setup again return logger.propagate = False logger.setLevel(logging.INFO) # in the formatter, use the variable "user_ip" formatter = logging.Formatter("%(name)s %(asctime)s %(levelname)s [user_ip=%(user_ip)s] - %(message)s") handler = logging.StreamHandler() handler.setLevel(logging.INFO) handler.addFilter(ContextFilter()) handler.setFormatter(formatter) logger.addHandler(handler) def main(): logger.info("Inside main") st.title("Title") text = st.sidebar.text_input("Text:") logger.info(f"This is the text: {text}") if __name__ == "__main__": init_logging() logger = logging.getLogger("foobar") main()