Azure App Service中Flask应用Logger日志未同步至Blob存储问题
Flask应用部署Azure App Service后,logger日志未同步到Blob存储的原因及解决方法
核心原因
- 日志输出通道差异:
print语句默认输出到stdout,Azure App Service会自动捕获stdout/stderr的内容并归类到AppServiceConsoleLogs类别,这也是你能在Blob中看到print日志的原因。而当前logging.basicConfig()配置的日志默认输出到stderr,但Azure的日志收集机制需要明确开启对应类别,且日志输出需被App Service的日志系统正确捕获。 - 诊断设置配置不全:Blob中仅出现
AppServiceConsoleLogs类别的日志,说明诊断设置中可能仅开启了控制台日志,未勾选**应用日志文件(Application Logs)**类别,导致Python logging输出的日志未被收集。 - Python logging配置未适配Azure环境:
logging.basicConfig()在Flask或Azure App Service的运行环境中可能未生效,默认的日志处理器没有将日志输出到stdout/stderr,导致Azure无法捕获这些日志。
解决步骤
1. 调整Python代码的logging配置,确保日志输出到stdout
修改代码中的logging部分,强制将日志输出到标准输出流,让Azure能够捕获:
from flask import Flask, request, jsonify import logging import sys app = Flask(__name__) # 配置日志处理器,输出到stdout handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) # 配置logger logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) logger.addHandler(handler) # 关闭日志传播,避免重复输出 logger.propagate = False @app.route("/api1") def api1(): print("hello data is getting printed") logger.info("API1 endpoint called. Hello, data is getting printed.") return jsonify("Hello World")
2. 检查并更新Azure App Service的应用日志配置
- 进入你的App Service资源,找到监控 > 应用服务日志页面
- 开启「应用日志文件」选项,将日志级别设置为**信息(Info)**或更低(如调试Debug),点击保存。
3. 确认诊断设置的日志类别配置
- 进入App Service的监控 > 诊断设置页面
- 确保已勾选**应用日志文件(Application Logs)**类别,并且目标已配置为你的Blob存储账户
- 确认日志级别筛选设置为Info或更低,确保info级别的日志会被同步到Blob
验证
重新部署修改后的代码,调用/api1接口后,等待几分钟(Azure日志同步有延迟),即可在Blob存储中看到logger.info输出的日志,对应的日志类别为AppServiceLogs。
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

