In order to do log tracking, we can use the following method to get a request_id or correlation_id thing.

main.py

import sys
import uvicorn
import logging
from uuid import uuid4
from loguru import logger
from fastapi import FastAPI
from fastapi import Request
from typing import Optional
from contextvars import ContextVar


correlation_id: ContextVar[Optional[str]] = ContextVar(
    'correlation_id', default=None)

app = FastAPI()


@app.middleware("http")
async def add_request_id_header(request: Request, call_next):
    correlation_id.set(uuid4().hex)
    response = await call_next(request)

    response.headers["x-request-id"] = correlation_id.get()
    return response


logger.remove()


def correlation_id_filter(record):
    record['correlation_id'] = correlation_id.get()
    return record['correlation_id']


fmt = "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <red> {correlation_id} </red> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"


logger.add(sys.stderr, format=fmt, level=logging.DEBUG,
           filter=correlation_id_filter)


@app.get('/')
def index():
    logger.info(f"Request with id ")
    return 'OK'


if __name__ == "__main__":
    uvicorn.run(app="main:app", host="0.0.0.0", port=8000)

Run the program with the following command:

python main.py

Use the following command to initiate a http request for testing

http http://localhost:8000/  -v
You can use apt install httpie or brew install httpie to install http command

The output is as follows:

GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8000
User-Agent: HTTPie/2.6.0



HTTP/1.1 200 OK
content-length: 4
content-type: application/json
date: Mon, 21 Feb 2022 13:36:50 GMT
server: uvicorn
x-request-id: a27b3b26382545e9ae15358a321a9568

"OK"

图片.png

In fact, there is already a corresponding open source implementation: snok/asgi-correlation-id

Reference article:
The middleware of the FastAPI entry series!


universe_king
3.4k 声望680 粉丝