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

Azure WebApp LogStream日志重复且级别显示错误问题求助

问题修复方案

问题根源分析

  1. 日志重复:logging.basicConfig会自动为根日志器添加一个StreamHandler,同时自定义日志器__name__又被添加了另一个StreamHandler,且日志器默认开启propagate=True(日志会向上传递到父日志器),导致同一条日志被两个Handler处理输出。
  2. 级别显示错误:AzureLogHandler未配置自定义格式化器,且OpenCensus默认处理逻辑未正确映射原日志级别,导致所有日志在LogStream中被标记为ERROR。

修改后的代码

import logging
import os
import uuid
from opencensus.ext.azure.log_exporter import AzureLogHandler

class CustomFormatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, style='%', custom_value=''):
        super().__init__(fmt, datefmt, style)
        self.custom_value = custom_value

    def format(self, record):
        record.custom_value = self.custom_value
        return super().format(record)

def set_logger():
    logger_id = str(uuid.uuid4())
    format_str = 'log_id: %(custom_value)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s'
    
    # 获取自定义日志器,避免使用logging.basicConfig(会给根日志器加默认Handler)
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    # 禁用日志传播,防止日志传递到根日志器导致重复输出
    logger.propagate = False
    
    # 配置StreamHandler(控制台/LogStream输出)
    stream_handler = logging.StreamHandler()
    custom_formatter = CustomFormatter(fmt=format_str, custom_value=logger_id)
    stream_handler.setFormatter(custom_formatter)
    logger.addHandler(stream_handler)
    
    # 配置AzureLogHandler,添加自定义格式化器并确保级别正确映射
    azure_handler = AzureLogHandler(connection_string=os.environ["LOG_CONNECTION_STRING"])
    azure_handler.setFormatter(custom_formatter)
    # 强制按原日志级别上报,避免默认标记为ERROR
    azure_handler._export_log_as_trace = False
    logger.addHandler(azure_handler)
    
    return logger

关键修改点说明

  • 移除logging.basicConfig:避免自动给根日志器添加默认Handler,从根源减少重复输出的可能。
  • 设置logger.propagate = False:阻止自定义日志器的日志向上传递到父日志器,彻底解决重复问题。
  • 给AzureLogHandler添加自定义格式化器:确保日志级别字段%(levelname)s被正确携带,Azure LogStream能识别原日志级别。
  • 设置azure_handler._export_log_as_trace = False:强制OpenCensus按原日志级别上报到Azure Monitor,避免所有日志被默认标记为ERROR级别。

验证方法

  1. 部署修改后的代码到Azure WebApp。
  2. 触发不同级别的日志(如logger.info("测试INFO日志")、logger.error("测试ERROR日志"))。
  3. 查看LogStream,确认每条日志只显示一次,且INFO级别日志标记为[INFO]、ERROR级别标记为[ERROR]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:35:06