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

Python开发Azure Service Bus触发函数:日志添上下文生成两条异常日志

问题分析与解决方案

问题根源

你手动添加了AzureLogHandler,但Azure Functions运行时已经内置了日志导出到Log Analytics的机制,这导致双重日志输出:

  • 一条来自你添加的AzureLogHandler:携带自定义custom_dimensions,但缺少函数运行时的Operation上下文(OperationName、OperationId等)
  • 一条来自平台默认日志系统:携带完整的函数运行上下文,但没有你的自定义属性

修复步骤

1. 移除手动添加的AzureLogHandler

删除以下两行冗余代码:

from opencensus.ext.azure.log_exporter import AzureLogHandler
logger.addHandler(AzureLogHandler())

2. 修正Service Bus消息解析逻辑

azservicebus.get_body().decode("utf-8")返回的是字符串,无法直接按字典取值,需要先解析为JSON对象:

import json
# ...
servicebusmessage = json.loads(azservicebus.get_body().decode("utf-8"))

3. 保留自定义属性传递逻辑

继续使用extra={"custom_dimensions": identifiers}传递自定义属性,平台默认日志系统会自动将这些属性合并到日志的Properties字段中,同时保留完整的Operation上下文信息。

完整修正后的代码

import azure.functions as func
import logging
import json

logger = logging.getLogger(__name__)

app = func.FunctionApp()

@app.service_bus_queue_trigger(
    arg_name="azservicebus",
    queue_name="%INPUT_QUEUE%",
    connection="CONNECTION",
)
def servicebus_queue_trigger(azservicebus: func.ServiceBusMessage):
    # 解析JSON格式的Service Bus消息
    servicebusmessage = json.loads(azservicebus.get_body().decode("utf-8"))
    identifiers = {
        'prop__requestId': servicebusmessage['batchId'],
        'prop__userId': servicebusmessage['userId']
    }
    # 传递自定义属性到日志
    logger.info("Message received", extra={"custom_dimensions": identifiers})

验证结果

部署修正后的代码后,每条Service Bus消息只会生成一条日志,同时包含:

  • 完整的函数运行上下文(OperationName、OperationId等)
  • 自定义的prop__requestId和prop__userId属性(在Log Analytics的Properties字段中)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:46:12