如何在无登录的公开Streamlit应用中记录用户操作日志?
实现方法
完全可以实现,核心是通过Streamlit的会话上下文获取用户IP,结合按钮点击事件触发日志写入,以下是具体步骤和代码示例:
1. 获取用户IP
Streamlit提供了会话上下文接口,可以直接获取客户端的IP地址。封装工具函数实现:
from st.runtime.scriptrunner import get_script_run_ctx def get_client_ip(): ctx = get_script_run_ctx() if ctx is None: return "unknown" return ctx.session_info.client.ip
2. 配置日志格式
使用Python标准库logging配置符合要求的日志格式,确保每条日志以|开头,包含时间、用户IP和按钮key:
import logging def setup_logger(): # 避免重复配置日志 if logging.getLogger().hasHandlers(): return logging.getLogger() logger = logging.getLogger() logger.setLevel(logging.INFO) # 设置日志格式 log_format = "|%(asctime)s : user at ip=%(ip)s clicked button key=%(button_key)s" formatter = logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S") # 创建文件处理器,写入日志文件 file_handler = logging.FileHandler("app_usage.log") file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger
3. 绑定按钮点击事件
在Streamlit应用中,为每个按钮添加点击判断,触发时写入日志:
import streamlit as st # 初始化日志 logger = setup_logger() # 获取当前用户IP user_ip = get_client_ip() # 示例按钮1 if st.button("提交表单", key="submit_form_btn"): logger.info("", extra={"ip": user_ip, "button_key": "submit_form_btn"}) st.success("已提交") # 示例按钮2 if st.button("重置数据", key="reset_data_btn"): logger.info("", extra={"ip": user_ip, "button_key": "reset_data_btn"}) st.info("已重置")
关键说明
- 日志会自动写入当前目录下的
app_usage.log文件,格式完全匹配需求样式。 - 部署到服务器时,需确保应用进程对日志文件所在目录有写入权限。
- 若无法获取用户IP(如本地测试或特殊网络环境),会用
unknown填充对应字段。
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

