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

如何通过OpenTelemetry将Streamlit应用日志发送至Azure?

如何用OpenTelemetry将Streamlit应用日志发送至Azure Application Insights

虽然Streamlit不在OpenTelemetry官方支持的Python框架列表中,但完全可以通过手动配置实现日志导出,以下是具体可行的方案:

方案一:配置OpenTelemetry接管Python标准日志(含Streamlit日志)

此方法会将Streamlit自身的日志以及你代码中的Python标准日志,统一通过OpenTelemetry发送到Azure。

1. 安装依赖包

pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-azure-monitor python-dotenv

2. 初始化OpenTelemetry并配置Azure导出

在你的Streamlit应用脚本最顶部添加以下代码(确保在import streamlit as st之前执行):

import os
from dotenv import load_dotenv
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.azure.monitor import AzureMonitorLogExporter, AzureMonitorTraceExporter

# 加载环境变量(建议把Azure连接字符串存在.env文件里)
load_dotenv()
CONNECTION_STRING = os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING")

# 初始化Trace Provider(可选,若需要追踪链路)
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
trace_exporter = AzureMonitorTraceExporter(connection_string=CONNECTION_STRING)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(trace_exporter))

# 初始化Logger Provider并绑定Azure日志导出
logger_provider = LoggerProvider()
log_exporter = AzureMonitorLogExporter(connection_string=CONNECTION_STRING)
logger_provider.add_log_record_processor(BatchLogRecordProcessor(log_exporter))

# 创建OpenTelemetry日志处理器,绑定到Python标准日志系统
handler = LoggingHandler(level="INFO", logger_provider=logger_provider)

# 获取Streamlit的日志器,添加OpenTelemetry处理器
import logging
st_logger = logging.getLogger("streamlit")
st_logger.addHandler(handler)

# 同时把处理器添加到根日志器,确保自定义日志也能被捕获
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel("INFO")

3. 配置环境变量

在项目根目录创建.env文件,添加Azure Application Insights的连接字符串:

APPLICATIONINSIGHTS_CONNECTION_STRING="你的Azure连接字符串"

方案二:手动埋点自定义日志/追踪

如果只需要发送业务相关的自定义日志,可以直接使用OpenTelemetry API手动创建日志事件:

# 承接方案一的初始化代码
from opentelemetry._logs import get_logger

logger = get_logger(__name__)

# 在Streamlit交互逻辑中添加自定义日志
import streamlit as st

st.title("OpenTelemetry + Streamlit Demo")

if st.button("触发自定义日志"):
    logger.info("用户点击了触发按钮", extra={"custom_key": "custom_value"})
    st.success("日志已发送")

关键注意事项

  • 初始化时机:必须在import streamlit as st之前完成OpenTelemetry的初始化,否则Streamlit的日志器可能无法被正确捕获。
  • 环境变量验证:确保APPLICATIONINSIGHTS_CONNECTION_STRING正确配置,且应用能读取到该变量。
  • Streamlit运行模式:Streamlit在调试模式下会反复重新运行脚本,可使用@st.cache_resource装饰器包裹OpenTelemetry初始化逻辑,避免重复创建导出器:
import streamlit as st

@st.cache_resource
def init_opentelemetry():
    # 把方案一中的初始化代码放到这里
    pass

init_opentelemetry()

验证日志是否送达

运行Streamlit应用后,登录Azure Portal进入对应的Application Insights资源,在日志中查询traces表,即可看到发送的日志内容:

traces
| where timestamp > ago(1h)
| order by timestamp desc

内容的提问来源于stack exchange,提问作者José Cordeiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:17