返回

Python 开发人员的 Azure 日志上下文指南:故障排除必备

python

在 Azure 日志中添加上下文:适用于 Python 开发人员的综合指南

简介

在现代云应用程序中,日志记录是调试、故障排除和性能分析不可或缺的一部分。Azure 日志平台为我们提供了强大的功能,使我们能够收集、分析和存储来自各种来源的日志数据。

然而,有时我们需要在日志中包含额外的信息,例如来自外部服务的请求上下文。在本文中,我们将探讨如何在 Python 中将上下文添加到 Azure 日志的属性中,特别关注如何存储服务总线消息中的信息。

问题

我们在部署一个 Python 服务作为 Azure 函数时遇到了两个主要问题:

  • 缺少日志字段: 创建的日志缺少一些重要的字段,如 OperationName、OperationId 和 ParentId。
  • 缺少上下文: 日志不包含我们尝试提供的上下文信息,即服务总线消息中的属性。

解决方案

经过一番深入调查,我们发现了解决这些问题的关键在于:

  1. 升级 Azure 日志处理程序: 确保使用 Azure 日志处理程序的最新版本,以避免过滤掉某些日志字段。
  2. 使用正确的键: 验证传递的 "custom_dimensions" 字典中的键与 Azure Monitor 预期的键匹配。

改进的代码

根据上述解决方案,我们更新了代码如下:

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 = {'RequestId': servicebusmessage['batchId'],
                   'UserId': servicebusmessage['userId']}
    properties = {"custom_dimensions": identifiers}
    logger.info("Message received", extra=properties)

验证

更新代码后,我们创建了一条日志,其中包含了从服务总线消息中提取的上下文信息,并且其他日志字段也得到了正确填充。

结论

通过将上下文添加到 Azure 日志的属性中,我们能够丰富日志数据,并轻松地关联来自不同来源的信息。这大大增强了我们的调试和故障排除能力,使我们能够更快地解决问题并改进应用程序的性能。

常见问题解答

  1. 为什么要将上下文添加到日志中?
    答:通过将上下文添加到日志中,我们可以将附加信息与日志事件相关联,从而更容易地调查和理解日志数据。

  2. 如何更新 Azure 日志处理程序?
    答:要更新 Azure 日志处理程序,请按照 Microsoft 文档中提供的说明操作:https://docs.microsoft.com/azure/azure-monitor/logs/agent-extensions-for-azure-monitor#upgrade-the-handler

  3. 如何验证日志字段是否正确填充?
    答:可以通过检查 Azure Monitor 中的日志分析工作区或使用 Azure CLI 或 PowerShell 命令来验证日志字段。

  4. 有哪些其他方法可以将上下文添加到日志中?
    答:除了使用 "custom_dimensions" 字典之外,还可以通过日志记录上下文过滤器或使用自定义日志格式程序来添加上下文。

  5. 将上下文添加到日志中是否有任何最佳实践?
    答:在将上下文添加到日志中时,建议使用标准化键,避免使用空格,并限制值的大小,以确保日志可读性和可管理性。