API: Add request logging

Log all the parts of a request if the config flag is set. The logged
fields are all server side anyways, so nothing is being exposed to
clients.

Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
kingbri 2024-07-22 21:33:10 -04:00
parent 522999ebb4
commit 3826815edb
4 changed files with 61 additions and 28 deletions

View file

@ -51,10 +51,7 @@ def from_args(args: dict):
cur_logging_config = logging_config()
GLOBAL_CONFIG["logging"] = {
**cur_logging_config,
**{
k.replace("log_", ""): logging_override[k]
for k in logging_override
},
**{k.replace("log_", ""): logging_override[k] for k in logging_override},
}
developer_override = args.get("developer")

View file

@ -1,9 +1,10 @@
"""Common utility functions"""
import asyncio
import json
import socket
import traceback
from fastapi import HTTPException, Request
from fastapi import Depends, HTTPException, Request
from loguru import logger
from pydantic import BaseModel
from typing import Optional
@ -108,3 +109,32 @@ async def add_request_id(request: Request):
request.state.id = uuid4().hex
return request
async def log_request(request: Request):
"""FastAPI depends to log a request to the user."""
log_message = [f"Information for {request.method} request {request.state.id}:"]
log_message.append(f"URL: {request.url}")
log_message.append(f"Headers: {dict(request.headers)}")
if request.method != "GET":
body_bytes = await request.body()
if body_bytes:
body = json.loads(body_bytes.decode("utf-8"))
log_message.append(f"Body: {dict(body)}")
logger.info("\n".join(log_message))
def get_global_depends():
"""Returns global dependencies for a FastAPI app."""
depends = [Depends(add_request_id)]
if config.logging_config().get("requests"):
depends.append(Depends(log_request))
return depends