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
相关产品推荐
相关产品推荐

