如何配置FastAPI将日志发布到CloudWatch?Lambda日志缺失解决
FastAPI部署到AWS Lambda后日志不显示在CloudWatch的解决方案
核心问题分析
Lambda通过捕获stdout和stderr输出内容到CloudWatch,你的日志在Lambda环境中无法显示,大概率是以下原因导致:
- FastAPI依赖的Uvicorn日志未正确输出到标准输出
logging.basicConfig与logging.conf配置冲突,日志处理器未正确关联- 日志配置加载时机错误,Lambda初始化阶段未完成日志配置
具体解决步骤
1. 调整FastAPI日志输出(适配Uvicorn)
使用Mangum适配器部署FastAPI到Lambda时,需要强制将Uvicorn及业务日志输出到stdout。修改app.py的日志配置逻辑:
import logging import sys from fastapi import FastAPI from mangum import Mangum # 重置root logger,避免默认配置冲突 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # 清除所有默认处理器 for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) # 添加指向stdout的StreamHandler handler = logging.StreamHandler(sys.stdout) log_format = "%(asctime)s %(levelname)s %(name)s %(message)s" date_format = "%Y-%m-%d %H:%M:%S" formatter = logging.Formatter(log_format, datefmt=date_format) handler.setFormatter(formatter) root_logger.addHandler(handler) app = FastAPI() # 示例路由,用于测试日志 @app.get("/") async def root(): logging.getLogger(__name__).info("Root endpoint accessed") return {"message": "Hello World"} handler = Mangum(app)
2. 统一日志配置,消除冲突
- 删除
app.py中的logging.basicConfig调用,避免与logging.conf重复配置。 - 如果继续使用
logging.conf,确保在应用启动时正确加载,且保留现有日志器:
import logging.config # 加载配置文件,disable_existing_loggers=False避免Uvicorn日志被禁用 logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
注意:部署时要确保logging.conf文件包含在Lambda部署包内,路径正确。
3. 验证自定义日志输出
在业务代码中添加测试日志,确认输出逻辑正常:
LOG = logging.getLogger(__name__) def process_feature_request(): LOG.info("Processing feature request...") # 业务逻辑代码
4. 确认Lambda权限
检查Lambda执行角色是否拥有以下CloudWatch日志权限:
logs:CreateLogGrouplogs:CreateLogStreamlogs:PutLogEvents
默认Lambda执行角色已包含这些权限,若使用自定义角色需手动添加。
验证方法
部署修改后的代码到Lambda,触发请求后查看对应CloudWatch日志组:
- 检查是否出现自定义业务日志
- 检查是否出现Uvicorn生成的访问日志(如
INFO: xxx - "GET / HTTP/1.1" 200 OK)
内容的提问来源于stack exchange,提问作者Istvan
相关产品推荐
相关产品推荐

