Azure WebApp LogStream日志重复且级别显示错误问题求助
问题修复方案
问题根源分析
- 日志重复:
logging.basicConfig会自动为根日志器添加一个StreamHandler,同时自定义日志器__name__又被添加了另一个StreamHandler,且日志器默认开启propagate=True(日志会向上传递到父日志器),导致同一条日志被两个Handler处理输出。 - 级别显示错误: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级别。
验证方法
- 部署修改后的代码到Azure WebApp。
- 触发不同级别的日志(如
logger.info("测试INFO日志")、logger.error("测试ERROR日志"))。 - 查看LogStream,确认每条日志只显示一次,且INFO级别日志标记为[INFO]、ERROR级别标记为[ERROR]。
内容的提问来源于stack exchange,提问作者user25648715
相关产品推荐
相关产品推荐

