使用gunicorn+supervisor启动fastapi服务,命令如下:
gunicorn main:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:8000 --access-logfile '-'
其中access log记录到的内容如下:
176.123.7.11:0 - "GET / HTTP/1.0" 200
只记录访问者的IP,没有记录访问时间,不利于后续debug,所以想着配置日志格式记录request time。查看文档docs.gunicorn.org后,将命令修改如下:
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:9800 --access-logfile '-' --access-logformat "%(h)s %(l)s %(u)s %(t)s %(s)s %(b)s"
发现不起作用,改成config file也还是不起作用:
# gunicorn.conf.py
access_log_format = '{"request": "%(r)s", "http_status_code": "%(s)s", "http_request_url": "%(U)s", "http_query_string": "%(q)s", "http_verb": "%(m)s", "http_version": "%(H)s"}'
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 127.0.0.1:9800 --access-logfile '-' --config gunicorn.conf.py
又试了--log-config的方式,也还是不起作用。
最后,搜了GitHub和stackoverflow才找到原因:https://github.com/encode/uvicorn/issues/527
解决方案是:修改gunicorn源码
vi xxx/site-packages/gunicorn/glogging.py # 修改这个文件
- access_fmt = r"%(message)s"
+ access_fmt = r"%(asctime)s %(message)s"
总之,这是uvicorn的问题,在bug被修复之前,修改gunicorn源码是比较简单的解决方法。
########################################################################
2024.02.25 补充:从github上发现不用改源码也能解决问题的方法了
githubhttps://github.com/tiangolo/fastapi/issues/1508#issuecomment-638365277
gunicorn启动命令去掉--access-logfile '-'
fastapi的lifespan中增加如下代码:
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
LOG_FMT = "%(asctime)s - %(levelname)s - %(message)s"
def config_access_log_to_show_time():
logger = logging.getLogger("uvicorn.access")
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(LOG_FMT))
logger.addHandler(handler)
@asynccontextmanager
async def lifespan(app: FastAPI):
config_access_log_to_show_time()
yield
app = FastAPI(lifespan=lifespan)
配置后的日志格式如下:
2024-02-25 16:02:48,435 - INFO - 127.0.0.1:52872 - "GET /docs HTTP/1.1" 418
2024-02-25 16:09:56,785 - INFO - 127.0.0.1:46822 - "POST /close_pid?pid=-1 HTTP/1.1" 200
注:要求fastapi是比较新的版本,如:pip install 'fastapi>=0.100'