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 useapt install httpie
orbrew 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"
In fact, there is already a corresponding open source implementation: snok/asgi-correlation-id
Reference article:
The middleware of the FastAPI entry series!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。