用Python为Azure日志属性添加上下文

0 投票
1 回答
89 浏览
提问于 2025-04-13 19:39

我正在把一个用Python 3.11.7写的服务部署成一个由服务总线消息触发的Azure函数。这个主要的服务运行得很好,但我在把服务总线消息中的信息记录到日志里时遇到了麻烦。具体来说,我想把这些信息存储在日志的Properties属性下。

根据微软的文档,我尝试把上下文信息放到一个字典里,然后把这个字典作为“custom_dimensions”的值传递给日志的额外参数。以下是我的代码:

import azure.functions as func
import logging
from opencensus.ext.azure.log_exporter import AzureLogHandler

logger = logging.getLogger(__name__)
logger.addHandler(AzureLogHandler())

app = func.FunctionApp()

@app.service_bus_queue_trigger(
    arg_name="azservicebus",
    queue_name="%INPUT_QUEUE%",
    connection="CONNECTION",
)
def servicebus_queue_trigger(azservicebus: func.ServiceBusMessage):
    servicebusmessage = azservicebus.get_body().decode("utf-8")
    identifiers = {'prop__requestId': servicebusmessage['batchId'],
                   'prop__userId': servicebusmessage['userId']}
    properties = {"custom_dimensions": identifiers}
    logger.info("Message received", extra=properties)

我本来希望每个服务总线消息都能生成一条日志,并且在日志的Properties里包含“prop_requestId”和“prop__userId”。然而,当我运行这个函数时,实际上在Azure的日志分析工作区里生成了两条日志:

  1. 第一条日志包含了预期的消息“Message received”,并且在日志的Properties里包含了想要的“prop__requestId”和“prop__userId”信息。不过,其他日志字段(比如OperationName、OperationId、ParentId)要么是空的,要么全是‘0’。

  2. 第二条日志也包含了预期的消息“Message received”,而且其他日志字段都有值(例如,OperationName = “servicebus_queue_trigger”)。但是,它没有包含我想提供的任何上下文信息。

1 个回答

0

不过,当我运行这个函数时,它实际上在Azure的日志分析工作区中创建了两个日志。

  • 是的,因为如果你在创建实例时将应用程序洞察(Application Insight)链接到函数应用,它会自动发送第一个日志。而第二个日志是通过opencensus,这是你在代码中明确配置的。如果你的函数是通过函数应用被调用的,这种情况是可行的。

  • 当我的函数在本地运行时,我只能看到一个日志。

  • opencensus生成的日志会有下面这种sdk类型。

这里输入图片描述

  • 从函数应用自动生成的日志会有下面这种sdk类型。

这里输入图片描述

  • 根据最新的更新OpenCensus将在2024年9月30日不再支持。

  • 你可以改用azure-monitor-opentelemetry库来为customDimensions添加属性。

撰写回答