Coverage for packages/server/src/langgate/server/core/logging.py: 44%
16 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
1"""Server-specific logging utilities."""
3import uuid
5import structlog
6from starlette.requests import Request
8from langgate.core.logging import StructLogger, get_logger, is_debug
11def set_structlog_request_context(request: Request) -> None:
12 """Set request context for structlog."""
13 structlog.contextvars.clear_contextvars()
14 structlog.contextvars.bind_contextvars(
15 method=request.method,
16 request_path=request.url.path,
17 request_client=str(request.client),
18 request_user_agent=request.headers.get("User-Agent", None),
19 request_id=request.headers.get("X-Request-ID", str(uuid.uuid4())),
20 )
23async def debug_request(logger: StructLogger, request: Request) -> None:
24 """Log request details."""
25 body = None
26 if request.method in ["POST", "PUT", "PATCH"]:
27 try:
28 body = await request.json()
29 except Exception as e:
30 body = f"Error reading body: {str(e)}"
31 await logger.adebug(
32 "debug_request",
33 method=request.method,
34 url=request.url,
35 body=body,
36 headers=request.headers,
37 )
40# Re-export these functions from core for convenience
41__all__ = ["set_structlog_request_context", "debug_request", "get_logger", "is_debug"]