You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无登录的公开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:40:42