当前位置: 首页 > news >正文

python项目在日志中 打印出详细的请求参数和返回的响应

为了打印出详细的请求参数和返回的响应,你可以使用FastAPI的中间件。以下是如何实现这一目标的示例:

  1. 添加中间件以捕获请求和响应:
from fastapi import FastAPI, Request
import loggingapp = FastAPI()# 设置日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.middleware("http")
async def log_request_response(request: Request, call_next):# 记录请求信息body = await request.body()logger.info(f"Request: {request.method} {request.url} - Body: {body.decode('utf-8')}")response = await call_next(request)# 记录响应信息response_body = b""async for chunk in response.body_iterator:response_body += chunkresponse.body_iterator = async_iterator([response_body])logger.info(f"Response: {response.status_code} - Body: {response_body.decode('utf-8')}")return response# 注册你的路由
from app.api import router as api_router
app.include_router(api_router)
  1. 更新路由文件以包含日志中间件:
# main.py
from fastapi import FastAPI
from app.api import router as api_routerapp = FastAPI()# 包含日志中间件
@app.middleware("http")
async def log_request_response(request: Request, call_next):body = await request.body()logger.info(f"Request: {request.method} {request.url} - Body: {body.decode('utf-8')}")response = await call_next(request)response_body = b""async for chunk in response.body_iterator:response_body += chunkresponse.body_iterator = async_iterator([response_body])logger.info(f"Response: {response.status_code} - Body: {response_body.decode('utf-8')}")return response# 注册路由
app.include_router(api_router)if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

这个中间件在处理请求时,会先记录请求的方法、URL和请求体内容,然后在返回响应之前记录响应的状态码和响应体内容。

请确保你的logging配置正确,方便记录详细日志信息。通过这种方式,你可以在日志中查看每个请求和响应的详细信息,从而更好地调试和监控你的应用程序。

辅助logging的详细配置信息:

import logginglogging_config = {"version": 1,"disable_existing_loggers": False,"formatters": {"default": {"()": "uvicorn.logging.DefaultFormatter","fmt": "%(levelprefix)s %(asctime)s %(message)s","datefmt": "%Y-%m-%d %H:%M:%S",},"access": {"()": "uvicorn.logging.AccessFormatter","fmt": "%(levelprefix)s %(asctime)s %(client_addr)s - '%(request_line)s' %(status_code)s","datefmt": "%Y-%m-%d %H:%M:%S",},},"handlers": {"default": {"formatter": "default","class": "logging.StreamHandler","stream": "ext://sys.stdout",},"access": {"formatter": "access","class": "logging.StreamHandler","stream": "ext://sys.stdout",},},"loggers": {"uvicorn": {"handlers": ["default"],"level": "DEBUG","propagate": False,},"uvicorn.access": {"handlers": ["access"],"level": "DEBUG","propagate": False,},},
}logging.config.dictConfig(logging_config)

相关文章:

  • 观成科技:基于深度学习技术的APT加密流量检测与分类检测方案
  • 任务倒计时App
  • 公司面试题总结(二)
  • BC C language
  • 【运维】Ubuntu换硬盘扩容
  • web刷题记录(5)
  • Python网络爬虫4-实战爬取pdf
  • PDF编辑与修正 提高工作效率 Enfocus PitStop Pro 2022 中文
  • Spring应用如何打印access日志和out日志(用于分析请求总共在服务耗费多长时间)
  • Mybatis06-动态SQL
  • K8s 卷快照类
  • WindTerm使用SSH密钥连接阿里云实例,服务器设置SSH密钥登录
  • NIFI启动后密码在哪里
  • STM32MP135裸机编程:配置RCC,修改主频到1GHz
  • XX食品有限公司智能制造汇报材料(71页PPT)
  • Asm.js的简单介绍
  • express如何解决request entity too large问题
  • Fundebug计费标准解释:事件数是如何定义的?
  • Git 使用集
  • JavaScript 基础知识 - 入门篇(一)
  • javascript从右向左截取指定位数字符的3种方法
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JSDuck 与 AngularJS 融合技巧
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • October CMS - 快速入门 9 Images And Galleries
  • PHP的类修饰符与访问修饰符
  • yii2中session跨域名的问题
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 理清楚Vue的结构
  • 区块链共识机制优缺点对比都是什么
  • 写给高年级小学生看的《Bash 指南》
  • 学习ES6 变量的解构赋值
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (04)odoo视图操作
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (poj1.2.1)1970(筛选法模拟)
  • (二)springcloud实战之config配置中心
  • (黑马C++)L06 重载与继承
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .chm格式文件如何阅读
  • .htaccess配置常用技巧
  • .NET Core引入性能分析引导优化
  • .NET Core中的时区转换问题
  • .net SqlSugarHelper
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 发送邮件
  • .NET 依赖注入和配置系统
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET的数据绑定