fix: suppress Uvicorn WebSocket rejection noise in logs

Unknown-path WS probes (e.g. /waapi) generate three INFO lines from
uvicorn.access + uvicorn.error on every attempt. Install a logging.Filter
on both loggers at startup to drop:
  - access log entries:  "WebSocket <path>" 403
  - error log entries:   "connection rejected ..." / "connection closed"

These are handled gracefully by _SPAStaticFiles; the logs add no value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Khoa (Revenovich) Tran Gia
2026-03-03 11:52:44 +07:00
parent 15721dd1c9
commit 1748cbf8d2

25
bot.py
View File

@@ -40,6 +40,26 @@ except Exception:
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class _UvicornWSNoiseFilter(logging.Filter):
"""Suppress per-connection WebSocket rejection noise from Uvicorn.
When an unknown path (e.g. /waapi probes) hits the server as a WebSocket
upgrade, Uvicorn logs three lines at INFO:
- uvicorn.access: '... "WebSocket /waapi" 403'
- uvicorn.error: 'connection rejected (403 Forbidden)'
- uvicorn.error: 'connection closed'
These are expected and handled gracefully; we just don't want them filling
the log.
"""
def filter(self, record: logging.LogRecord) -> bool:
msg = record.getMessage()
if '"WebSocket ' in msg and ' 403' in msg:
return False
if msg.startswith("connection rejected") or msg == "connection closed":
return False
return True
_PROJECT_ROOT = Path(__file__).resolve().parent _PROJECT_ROOT = Path(__file__).resolve().parent
@@ -192,6 +212,11 @@ async def main() -> None:
loop="none", # use existing event loop loop="none", # use existing event loop
) )
uvi_server = uvicorn.Server(uvi_config) uvi_server = uvicorn.Server(uvi_config)
_ws_filter = _UvicornWSNoiseFilter()
logging.getLogger("uvicorn.access").addFilter(_ws_filter)
logging.getLogger("uvicorn.error").addFilter(_ws_filter)
coroutines.append(uvi_server.serve()) coroutines.append(uvi_server.serve())
logger.info( logger.info(
"Web UI enabled at http://%s:%d", config.web_host, config.web_port "Web UI enabled at http://%s:%d", config.web_host, config.web_port