Python FastAPI 健康检查日志

我最近使用 FastAPI 框架创建了一个 python API,并让它在我的 AWS ECS 服务中运行良好。我已经为 ALB 的健康检查设置了 /health 端点。我的 ECS 容器的入口点是这个命令

ENTRYPOINT ["app/start.sh"]

这就是我在 start.sh 中的内容

uvicorn main:app --host 0.0.0.0

我遇到的问题是,当 ALB 命中 /health 端点时,我的 ECS 日志中充满了 200 个 OK。非常令人沮丧的是,我几乎找不到我的 API 日志,而 Cloudwatch 充满了 /health 端点日志。有没有办法可以避免健康端点日志?

enter image description here

@app.get("/health", response_class=PlainTextResponse)
def healthcheck():
    return "200"
stack overflow Python FastAPI health check logs
原文答案

答案:

作者头像

The comment on this github issue 提供了一个示例,说明如何在 Python 应用程序中使用 uvicorn 过滤给定端点的日志。

它说明您需要为端点定义一个过滤器,并将其添加到记录器中。作为 MatsLindh mentioned in the comments below ,上述方法过滤掉日志消息中出现的任何 /health - 这意味着它也会过滤掉端点,例如 /foo/health/foo/health/bar 等。

上面的修改示例过滤掉 /health 端点的访问日志:

import logging
import uvicorn
from fastapi import FastAPI

app = FastAPI()

# Define the filter
class EndpointFilter(logging.Filter):
    def filter(self, record: logging.LogRecord) -> bool:
        return record.args and len(record.args) >= 3 and record.args[2] != "/health"

# Add filter to the logger
logging.getLogger("uvicorn.access").addFilter(EndpointFilter())

# Define the API endpoints
@app.get('/health')
def health():
    print('health endpoint')

@app.get('/test')
def test():
    print('test endpoint')

点击 /test 端点,我们可以看到有一个访问日志和函数的输出。 /health 端点没有访问日志,只有函数的输出。

INFO:     Started server process [11272]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
test endpoint
INFO:     127.0.0.1:54014 - "GET /test HTTP/1.1" 200 OK
health endpoint