Uvicorn仅记录启停信息,如何配置完整记录请求日志?
问题:Uvicorn无法记录请求日志
我的Uvicorn日志无法记录如下这类请求日志:
INFO: 127.0.0.1:63695 - "POST /uploadfile2/ HTTP/1.1" 404 Not Found INFO: 127.0.0.1:63699 - "POST /uploadfile/ HTTP/1.1" 200 OK
目前日志仅显示系统启动和停止的信息,我的日志配置代码如下:
formatter = Formatter('%(asctime)s | %(levelname)-8s | %(funcName)-19s | %(message)s') handler = TimedRotatingFileHandler(conf_args["logPath"], when="midnight") handler.setFormatter(formatter) log = getLogger('log') fastapi_logger = getLogger("uvicorn") log.addHandler(handler) fastapi_logger.addHandler(handler) log.setLevel(logging_level)
启动脚本方式:
if __name__ == '__main__': uvicorn.run(app, port=8009)
解决方案
问题出在你只配置了uvicorn主日志器,但Uvicorn的请求日志是由uvicorn.access这个子日志器负责输出的,需要额外配置这个日志器:
- 添加对
uvicorn.access日志器的配置,给它添加相同的handler,并设置日志级别 - 确保所有相关日志器的级别都正确设置,避免级别过滤导致日志不输出
修改后的日志配置代码:
import logging from logging.handlers import TimedRotatingFileHandler from logging import Formatter, getLogger # 假设logging_level已定义,例如logging.INFO formatter = Formatter('%(asctime)s | %(levelname)-8s | %(funcName)-19s | %(message)s') handler = TimedRotatingFileHandler(conf_args["logPath"], when="midnight") handler.setFormatter(formatter) # 自定义日志器配置 log = getLogger('log') log.addHandler(handler) log.setLevel(logging_level) # Uvicorn主日志器配置 fastapi_logger = getLogger("uvicorn") fastapi_logger.addHandler(handler) fastapi_logger.setLevel(logging_level) # *关键:配置Uvicorn请求日志器* uvicorn_access_logger = getLogger("uvicorn.access") uvicorn_access_logger.addHandler(handler) uvicorn_access_logger.setLevel(logging_level) # 可选:若不想请求日志同时输出到控制台,可关闭日志传播 # uvicorn_access_logger.propagate = False
额外注意事项:
- 日志配置代码必须在
uvicorn.run()之前执行,确保Uvicorn启动时加载你的自定义配置 - 若
logging_level设置为WARNING及以上,请求日志的INFO级信息会被过滤,需保证级别为INFO或更低
内容的提问来源于stack exchange,提问作者Flouu
相关产品推荐
相关产品推荐

