为了做日志跟踪,咱们能够用上面的方法来搞一个 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