Spaces:
Running
Running
File size: 2,323 Bytes
b2c1c67 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | import json
import logging
import sys
import time
import uuid
from collections.abc import Awaitable, Callable
from fastapi import Request, Response
class JsonFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
payload = {
"ts": self.formatTime(record, "%Y-%m-%dT%H:%M:%S%z"),
"level": record.levelname,
"logger": record.name,
"message": record.getMessage(),
}
for key in ("request_id", "method", "path", "status", "duration_ms", "user_id"):
value = getattr(record, key, None)
if value is not None:
payload[key] = value
if record.exc_info:
payload["exception"] = self.formatException(record.exc_info)
return json.dumps(payload, ensure_ascii=False)
def configure_logging(debug: bool = False) -> None:
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(JsonFormatter())
root = logging.getLogger()
root.handlers = [handler]
root.setLevel(logging.DEBUG if debug else logging.INFO)
for name in ("httpx", "httpcore", "chromadb", "uvicorn.access"):
logging.getLogger(name).setLevel(logging.WARNING)
logger = logging.getLogger("synapse")
async def request_logging_middleware(
request: Request, call_next: Callable[[Request], Awaitable[Response]]
) -> Response:
request_id = uuid.uuid4().hex[:12]
request.state.request_id = request_id
start = time.perf_counter()
try:
response = await call_next(request)
except Exception:
duration_ms = round((time.perf_counter() - start) * 1000)
logger.exception(
"request failed",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"duration_ms": duration_ms,
},
)
raise
duration_ms = round((time.perf_counter() - start) * 1000)
logger.info(
"request",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"status": response.status_code,
"duration_ms": duration_ms,
},
)
response.headers["X-Request-ID"] = request_id
return response
|