Code: Select all
logger = logging.getLogger(__name__)
app = FastAPI()
app.add_middleware(SetterMiddlware)
app.add_middleware(FooMiddleware)
@app.get("/")
def read_root(setter = Depends(set_request_id)):
print("Adding req_id to body", req_id.get()) # This is 1234567890
logging.info("hello")
return {"Req_id": str(req_id.get())}
< /code>
Und das sind meine Middlewares < /p>
class SetterMiddlware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
calculated_id = "1234567890"
req_id.set(calculated_id)
request.state.req_id = calculated_id
response = await call_next(request)
return response
class FooMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
response = await call_next(request)
return response
< /code>
und der Protokollierungsfilter < /p>
from vars import req_id
class CustomFilter(Filter):
"""Logging filter to attach the user's authorization to log records"""
def filter(self, record: LogRecord) -> bool:
record.req_id = req_id.get()
return True
< /code>
Und schließlich einem Teil meiner Protokollkonfiguration < /p>
folgt...
"formatters": {
"default": {
"format": "%(levelname)-9s %(asctime)s [%(req_id)s]| %(message)s",
"datefmt": "%Y-%m-%d,%H:%M:%S",
},
},
"handlers": {
...
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "default",
"stream": "ext://sys.stderr",
"filters": [
"voxy_filter",
],
"level": logging.NOTSET,
},
...
"loggers": {
"": {
"handlers": ["console"],
"level": logging.DEBUG,
},
"uvicorn": {"handlers": ["console"], "propagate": False},
},
Code: Select all
FooMiddleware
Code: Select all
Adding req_id to body 1234567890
INFO 2025-04-14,15:02:28 [1234567890]| hello
INFO 2025-04-14,15:02:28 [1234567890]| 127.0.0.1:52912 - "GET / HTTP/1.1" 200
Code: Select all
Adding req_id to body 1234567890
INFO 2025-04-14,15:03:56 [1234567890]| hello
INFO 2025-04-14,15:03:56 [None]| 127.0.0.1:52919 - "GET / HTTP/1.1" 200