为了做日志跟踪,咱们能够用上面的方法来搞一个 request_id 或者说 correlation_id 的货色。

main.py

import sysimport uvicornimport loggingfrom uuid import uuid4from loguru import loggerfrom fastapi import FastAPIfrom fastapi import Requestfrom typing import Optionalfrom contextvars import ContextVarcorrelation_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 responselogger.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)

应用上面的命令运行程序:

python main.py

用上面的命令发动 http 申请来做测试

http http://localhost:8000/  -v
能够应用 apt install httpie 或者 brew install httpie 来装置 http 命令

输入如下:

GET / HTTP/1.1Accept: */*Accept-Encoding: gzip, deflateConnection: keep-aliveHost: localhost:8000User-Agent: HTTPie/2.6.0HTTP/1.1 200 OKcontent-length: 4content-type: application/jsondate: Mon, 21 Feb 2022 13:36:50 GMTserver: uvicornx-request-id: a27b3b26382545e9ae15358a321a9568"OK"

事实上,曾经有相应的开源实现了:snok/asgi-correlation-id