You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure Functions(FastAPI-AsgiFunctionApp):日志在Application Insights中显示但不出现于调用标签页——日志分类问题

Azure Functions(FastAPI-AsgiFunctionApp):日志在Application Insights中显示但不出现于调用标签页——日志分类问题

我之前也遇到过一模一样的问题,折腾了好一阵才搞清楚根源和解决办法,下面给你详细说下:

问题根源

这本质是日志分类的差异导致的:

  • 普通Python函数中,Azure Functions的Python Worker会自动拦截logging模块的输出,将其关联到当前函数实例,日志分类为Function.<function-name>.User,这类日志会自动同步到Invocations标签页的单条调用日志中
  • 但用AsgiFunctionApp包装FastAPI时,ASGI应用的日志输出(比如你用logging.basicConfig添加的StreamHandler输出的内容)会被Functions宿主直接捕获为控制台输出,归类为Host.Function.Console——这个分类的日志只会出现在Log Stream和Application Insights,不会展示在Invocations标签页的单条调用详情里

解决方案(两种可选方案)

方案一:直接使用Azure Functions上下文的Logger(最推荐)

这种方法最直接,日志会自动归类到正确的Function.<function-name>.User分类,而且不需要额外配置logging模块。

修改你的代码如下:

import azure.functions as func
from fastapi import FastAPI, Request, Depends
from azure.functions import AsgiFunctionApp
from typing import Optional

# FastAPI 应用初始化
app = FastAPI()

# 定义依赖:从ASGI请求的scope中获取Azure Functions上下文
def get_azf_context(request: Request) -> Optional[func.Context]:
    return request.scope.get("azure_functions_context")

@app.get("/health")
async def health_check(azf_context: func.Context = Depends(get_azf_context)):
    # 使用上下文自带的log对象打日志
    azf_context.log.info("Health check endpoint called")
    return {"status": "healthy"}

@app.post("/logging/test")
async def test_logging(azf_context: func.Context = Depends(get_azf_context)):
    azf_context.log.info("Test logging endpoint - this should appear in Invocations")
    azf_context.log.warning("Warning level log")
    azf_context.log.error("Error level log")
    return {"message": "Logging test completed"}

# Azure Functions 包装器
function_app = AsgiFunctionApp(app=app, http_auth_level=func.AuthLevel.FUNCTION)

方案二:配置Python Logging模块适配Azure Functions分类

如果你不想每个接口都注入上下文,也可以修改logging配置,让你的Python日志自动走正确的分类通道:

import logging
import azure.functions as func
from fastapi import FastAPI
from azure.functions import AsgiFunctionApp

# 配置日志:复用Azure Functions Worker的日志处理器
# 获取Azure Functions Worker的核心日志器
azf_worker_logger = logging.getLogger("azure.functions")
# 获取我们的应用日志器(用__name__或者自定义名称都可以)
app_logger = logging.getLogger(__name__)
# 清除应用日志器的默认处理器,避免日志重复输出
app_logger.handlers.clear()
# 添加Worker日志器的处理器到应用日志器,让日志走正确的分类通道
for handler in azf_worker_logger.handlers:
    app_logger.addHandler(handler)
app_logger.setLevel(logging.INFO)

# FastAPI 应用初始化
app = FastAPI()

@app.get("/health")
async def health_check():
    app_logger.info("Health check endpoint called")
    return {"status": "healthy"}

@app.post("/logging/test")
async def test_logging():
    app_logger.info("Test logging endpoint - this should appear in Invocations")
    app_logger.warning("Warning level log")
    app_logger.error("Error level log")
    return {"message": "Logging test completed"}

# Azure Functions 包装器
function_app = AsgiFunctionApp(app=app, http_auth_level=func.AuthLevel.FUNCTION)

验证步骤

修改代码后部署测试:

  1. 调用你的/logging/test接口触发日志
  2. 进入Azure Portal → 你的Function App → 对应函数 → Invocations标签页
  3. 找到最近的调用记录,点击右侧的Logs按钮,就能看到你的日志了
  4. 同时去Application Insights中查看,日志分类已经变成Function.<function-name>.User

额外说明

两种方案都需要移除logging.basicConfig,因为它会添加一个额外的StreamHandler,导致日志重复输出,同时强制日志走控制台通道,回到原问题的分类错误问题上。

火山引擎 最新活动