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

1"""Server-specific logging utilities.""" 

2 

3import uuid 

4 

5import structlog 

6from starlette.requests import Request 

7 

8from langgate.core.logging import StructLogger, get_logger, is_debug 

9 

10 

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 ) 

21 

22 

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 ) 

38 

39 

40# Re-export these functions from core for convenience 

41__all__ = ["set_structlog_request_context", "debug_request", "get_logger", "is_debug"]