You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:50:30