Azure Linux Web App中Python日志无法在流式日志显示的问题排查
环境与代码情况
- 技术栈:Azure AI Search + Python后端,部署为Linux Web App
- 目标代码文件:
app/backend/approaches/charreadretrieveread.py - 核心代码片段:
async def run_until_final_call( self, history: list[dict[str, str]], overrides: dict[str, Any], auth_claims: dict[str, Any], should_stream: bool = False, ) -> tuple[dict[str, Any], Coroutine[Any, Any, Union[ChatCompletion, AsyncStream[ChatCompletionChunk]]]]: #print("/chat user question: " , history[-1]) logging.basicConfig(level=logging.INFO) logging.info('Hello, logging!')
- Web服务日志配置:
level: verbose application logging: file system quota: 35 mb retention periods(days): 1
问题
代码无报错,但Azure门户「后端->流式日志」中无法看到Hello, logging!日志,请求排查原因。
排查方向及解决方案
logging.basicConfig生效时机限制
Python中logging.basicConfig仅在日志系统首次初始化时生效,若应用其他模块(如FastAPI/Flask框架)已提前初始化日志,后续调用basicConfig不会覆盖原有配置,导致logging.info使用的是旧的级别或输出渠道。
解决:改用直接获取日志器并配置的方式:logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.info('Hello, logging!')日志未输出到标准流
Azure Linux Web App要求Python日志输出到stdout或stderr才能在流式日志中显示,默认logging.basicConfig可能将日志写入文件而非控制台。
解决:手动配置日志处理器输出到标准输出:import sys logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler)日志级别不匹配
虽然Azure门户配置了verbose(对应Python的DEBUG级别),但如果应用全局日志级别被设为WARNING及以上,INFO级别的日志会被过滤。
解决:检查应用是否有全局日志级别设置,确保至少为INFO或更低。流式日志延迟
Azure流式日志存在几分钟的延迟,并非实时显示,可等待2-3分钟后刷新页面查看,或到「日志文件」选项卡确认是否生成了日志文件。日志存储配额或权限问题
若当前日志文件已占满35MB配额,新日志无法写入;另外Linux Web App进程可能缺乏日志目录写入权限。
解决:到「日志文件」选项卡查看文件生成情况,配额不足则清理旧日志或调整配额;权限问题可尝试重启Web App。异步函数未被触发
日志位于异步函数run_until_final_call中,需确认该函数是否被正常调用。若函数未执行,自然不会输出日志。
解决:临时添加print语句测试,或梳理函数调用链路确认执行逻辑。
内容的提问来源于stack exchange,提问作者aaa aaa

