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

Python中OpenTelemetry无法将含异常详情的日志写入Application Insights

解决方案:OpenTelemetry迁移后保留自定义异常日志消息

OpenTelemetry Python SDK的默认日志处理逻辑,在处理带exc_info=True的日志时,会优先将异常栈追踪作为核心内容,导致自定义错误消息被覆盖或未映射到Application Insights的对应字段,这和OpenCensus的处理逻辑存在差异。以下是两种可行的解决方式:

方法一:自定义日志处理器映射字段

通过自定义LogRecordProcessor,将自定义错误消息单独存入日志属性,确保其能被Application Insights捕获:

from opentelemetry.sdk._logs import LogRecord, LogRecordProcessor
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from azure.monitor.opentelemetry.exporter import AzureMonitorLogExporter
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry._logs import set_logger_provider

class CustomLogProcessor(LogRecordProcessor):
    def __init__(self, exporter):
        self.inner_processor = BatchLogRecordProcessor(exporter)

    def on_start(self, log_record: LogRecord):
        # 将自定义消息存入自定义属性,或合并到message字段
        if log_record.exc_info and log_record.message:
            log_record.attributes["custom_error_msg"] = log_record.message
        self.inner_processor.on_start(log_record)

    def on_end(self, log_record: LogRecord):
        self.inner_processor.on_end(log_record)

    def shutdown(self):
        self.inner_processor.shutdown()

    def force_flush(self, timeout_millis: int = 30000) -> bool:
        return self.inner_processor.force_flush(timeout_millis)

# 初始化导出器与自定义处理器
exporter = AzureMonitorLogExporter(connection_string="你的应用洞察连接字符串")
custom_processor = CustomLogProcessor(exporter)

# 配置全局日志提供者
logger_provider = LoggerProvider()
logger_provider.add_log_record_processor(custom_processor)
set_logger_provider(logger_provider)

配置完成后,你可以在Application Insights的日志属性中找到custom_error_msg字段,查看自定义的错误消息。

方法二:自定义日志格式合并消息与异常

通过Python logging模块的自定义Formatter,将自定义消息与异常栈追踪合并为完整的日志内容,确保OpenTelemetry捕获到包含自定义消息的完整日志:

import logging
from opentelemetry.instrumentation.logging import LoggingInstrumentor

# 定义包含自定义消息和异常的格式
formatter = logging.Formatter('%(levelname)s: %(message)s\nException Details: %(exc_info)s')
handler = logging.StreamHandler()
handler.setFormatter(formatter)

# 启用日志 instrumentation 并设置格式化
LoggingInstrumentor().instrument(set_logging_format=True)

# 配置根日志器
root_logger = logging.getLogger()
root_logger.addHandler(handler)
root_logger.setLevel(logging.INFO)

这种方式下,logging.error("自定义消息", exc_info=True)和logging.exception("自定义消息")生成的日志会包含自定义内容,完整发送到Application Insights。

额外建议

确保你使用的azure-monitor-opentelemetry-exporter是最新版本,旧版本可能存在字段映射的bug,执行以下命令升级:

pip install --upgrade azure-monitor-opentelemetry-exporter

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:32:53