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

如何在Python异步应用中用Logger记录OpenTelemetry数据?

问题原因

你在logging Filter里使用with trace.get_current_span() as span时,with语句会在代码块结束后自动调用span的end()方法。但当前的span是由tracer.start_as_current_span的上下文管理的,它已经在自身的with块结束时执行过end()了,所以这里重复调用就会触发"Calling end() on an ended span"的警告。

修复方案

修改spanFilter类,直接获取当前span即可,不需要用with语句包裹:

class spanFilter(logging.Filter):
    def filter(self, record: LogRecord) -> bool:
        span = trace.get_current_span()
        # 在这里添加给日志添加trace上下文的逻辑,比如:
        if span.is_recording():
            record.trace_id = format(span.get_span_context().trace_id, '032x')
            record.span_id = format(span.get_span_context().span_id, '016x')
        return True

补充说明

trace.get_current_span()只是获取当前活跃的span实例,它的生命周期由创建它的上下文(比如tracer.start_as_current_span的with块)负责管理,不需要我们手动调用end()。只有当你手动调用tracer.start_span创建span时,才需要自行处理结束逻辑。

如果需要在日志中显示这些trace属性,可以调整日志格式:

logging.basicConfig(
    level=logging.INFO,
    format='%(levelname)s:%(name)s: [trace_id=%(trace_id)s span_id=%(span_id)s] %(message)s'
)

内容的提问来源于stack exchange,提问作者RedBullet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:52:50