gunicorn日志--access-logformat不起作用

使用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上发现不用改源码也能解决问题的方法了

githubicon-default.png?t=N7T8https://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'

$gunicorn -h 是用来显示`gunicorn`(一个常用的Python WSGI服务器)的命令行帮助信息的。`gunicorn`用于运行基于WSGI的应用程序,通常与Django或Flask等框架一起使用。 当你在终端中输入这个选项时,它会给出关于如何使用`gunicorn`以及它的参数和选项的详细说明,例如启动一个新的工作进程、设置配置文件路径、指定应用程序模块等。 具体的帮助信息可能包括: ``` usage: gunicorn [-acBdDeEfgGhiIlLmMnNooOprRsStTuUVvwxXWZ] [--bind | -b <binding>] [--certfile | -c <file>] [--chdir | -C <directory>] [--config-file | -c <file>] [--daemon | -D] [--debug <level>] [--deamonize | -d <file>] [--error-logfile | -e <file>] [--graceful-timeout | -t <seconds>] [--groups <group1[,group2...]] [--help] [--ident | -i <identifier>] [--insecure-bind | -k <worker-type>] [--keyfile | -k <file>] [--limit-as <soft,hard>] [--log-level <level>] [--logger-name <name>] [--max-requests <number>] [--max-threads <number>] [--min-threads <number>] [--pidfile | -P <file>] [--preload-apps] [--proc-name <name>] [--pythonpath | -p <path>] [--raw-data-dir | -r <directory>] [--reload] [--reporter | -R <module:string>] [--syslog] [--timeout <seconds>] [--user <user>] [--workers <number>] [--worker-class | -w <class>] [--worker_connections <number>] [--workers-per-core] [--x-forwarded-host | -H <host>] [--x-forwarded-proto | -f <proto>] [--worker-tmp-dir | -T <directory>] [--zero-worker-connections] ``` 要查看详细的帮助信息,你可以直接在终端执行 `gunicorn -h` 并按回车键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值