如何配置 FastAPI 日志记录,使其在本地和生产中都能与 Uvicorn 一起使用?

Ist*_*van 5 python logging fastapi

我有一个 api.py 文件,其中包含以下内容:

from fastapi import FastAPI
import logging
import uvicorn

app = FastAPI(title="api")

LOG = logging.getLogger(__name__)
LOG.info("API is starting up")
LOG.info(uvicorn.Config.asgi_version)

@app.get("/")
async def get_index():
    LOG.info("GET /"
    return {"Hello": "Api"}

Run Code Online (Sandbox Code Playgroud)

该应用程序在本地运行:

uvicorn api:app --reload
Run Code Online (Sandbox Code Playgroud)
INFO:     Will watch for changes in these directories: ['/Users/user/code/backend/api']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [44258] using StatReload
INFO:     Started server process [44260]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
Run Code Online (Sandbox Code Playgroud)

它不记录任何启动消息。

稍后向 api 发送 http 请求时:

INFO:     127.0.0.1:50538 - "POST /api/v1/endpoint HTTP/1.1" 200 OK
Run Code Online (Sandbox Code Playgroud)

在函数体中,有 LOG.info("example") 也没有被记录。

有没有一种方法可以使 FastAPI 日志记录与 Uvicorn 一起工作并且也在生产中工作(独立于 Uvicorn 等执行环境)。

Chr*_*ris 6

确保添加StreamHandler和/或FileHandler并设置级别/严重性(即DEBUGINFOWARNING等)。以下示例基于此答案此答案更多详细信息和示例可以在 Python 的官方文档页面中找到。您可能还想查看可用于格式化日志记录的所有可用LogRecord属性。

工作示例

from fastapi import FastAPI
import logging
import sys


app = FastAPI(title='api')

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler(sys.stdout)
log_formatter = logging.Formatter("%(asctime)s [%(processName)s: %(process)d] [%(threadName)s: %(thread)d] [%(levelname)s] %(name)s: %(message)s")
stream_handler.setFormatter(log_formatter)
logger.addHandler(stream_handler)

logger.info('API is starting up')


@app.get('/')
async def main():
    logger.info('GET /')
    return 'ok'
Run Code Online (Sandbox Code Playgroud)