Uvicorn访问日志默认开启,但受--access-log参数、代码中access_log参数及log_level级别、log-config配置文件三者共同控制,任一环节禁用或级别不匹配均导致日志不输出。

默认就开启,除非你显式关掉了 —— 这是大多数人的第一误解。Uvicorn 的 --access-log 默认为 True,但如果你用了 --no-access-log、或在代码中传了 access_log=False,它就会静默不输出请求行日志。
命令行启动时访问日志开关
最常见场景:用 uvicorn 命令跑服务,想确认是否看到类似 INFO: 127.0.0.1:54321 - "GET /health HTTP/1.1" 200 这样的日志。
- ✅ 默认就有:
uvicorn main:app就会输出访问日志(走uvicorn.accesslogger) - ❌ 显式关闭:
uvicorn main:app --no-access-log或--access-log False - ⚠️ 注意:如果同时用了
--log-config,--access-log参数会被忽略,日志行为完全由配置文件决定 - ? 想改访问日志格式?必须改
formatters.access.fmt,比如加时间戳:"%(asctime)s %(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s"
代码内启动时 access_log 参数含义
调用 uvicorn.run() 时,access_log 控制的是「是否启用 uvicorn.access 日志器」,不是“是否打印”。它和 log_level 配合生效。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
- 默认值是
True,但若log_level="warning",即使access_log=True,访问日志也不会出现(因为uvicorn.access的 level 是INFO,低于 warning) - 正确写法示例:
uvicorn.run( "main:app", host="0.0.0.0", port=8000, access_log=True, # 启用 access logger log_level="info" # 确保 info 级别日志可见 ) - ⚠️ 坑点:不要设
access_log=True却配log_level="error",结果什么访问记录都看不到
配置文件里访问日志的控制逻辑
用 --log-config logging_config.py 时,Uvicorn 不再读取 --access-log 参数,一切以配置字典为准。
- 关键路径:
LOGGING_CONFIG["loggers"]["uvicorn.access"] - 必须确保该 logger 的
"level"≥ 当前全局log_level(比如设成"INFO") - 必须有至少一个 handler 指向它,例如:
"handlers": ["access"],且"access"handler 存在并配置正确 - 常见错误:复制了默认配置但删掉了
"access"handler,或把"uvicorn.access"的"handlers"写成空列表
真正容易被忽略的点是:访问日志是否可见,取决于三个地方是否对齐——命令行参数、代码传参、配置文件内容,三者有任一环节显式禁用或级别压过,它就消失。别只盯着 --access-log 看。










