如何通过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
相关产品推荐
相关产品推荐

