如何在FastAPI中查看Invalid HTTP Request received的详细日志?
解决Uvicorn「Invalid HTTP request received.」警告无详细日志的问题
核心原因
这个警告是Uvicorn的HTTP解析器输出的,默认日志格式未包含请求IP、时间等元数据,需要自定义Uvicorn的日志配置来补充这些信息。
具体解决方案
方法1:命令行启动时指定日志格式
直接在启动命令中通过--log-format参数自定义日志格式,包含所需字段:
uvicorn main:app --host 0.0.0.0 --port 8000 --log-format "%(levelname)s: %(asctime)s - %(client_addr)s - %(message)s"
各字段说明:
%(levelname)s:日志级别(如WARNING)%(asctime)s:日志生成时间%(client_addr)s:请求客户端的IP和端口%(message)s:原警告内容
方法2:通过日志配置文件自定义
创建logging.conf文件,配置更精细的日志规则:
[loggers] keys=root,uvicorn,uvicorn.error [handlers] keys=console [formatters] keys=default [logger_root] level=INFO handlers=console [logger_uvicorn] level=INFO handlers=console propagate=0 qualname=uvicorn [logger_uvicorn.error] level=WARNING handlers=console propagate=0 qualname=uvicorn.error [handler_console] class=StreamHandler formatter=default args=(sys.stdout,) [formatter_default] format=%(levelname)s: %(asctime)s - %(client_addr)s - %(message)s datefmt=%Y-%m-%d %H:%M:%S
启动时指定该配置文件:
uvicorn main:app --host 0.0.0.0 --port 8000 --log-config logging.conf
方法3:代码中启动Uvicorn时配置日志
如果通过Python代码直接启动Uvicorn,可在代码内传入自定义日志配置:
import uvicorn from fastapi import FastAPI app = FastAPI() # 覆盖默认日志格式 log_config = uvicorn.config.LOGGING_CONFIG log_config["formatters"]["default"]["fmt"] = "%(levelname)s: %(asctime)s - %(client_addr)s - %(message)s" log_config["formatters"]["default"]["datefmt"] = "%Y-%m-%d %H:%M:%S" if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_config=log_config)
验证效果
配置完成后,再次收到无效HTTP请求时,日志会输出类似内容:
WARNING: 2024-05-20 14:30:00 - 192.168.1.100:54321 - Invalid HTTP request received.
内容的提问来源于stack exchange,提问作者AIRGG
相关产品推荐
相关产品推荐

