From 1748cbf8d28a38e42cd9e85baf809b11a6235298 Mon Sep 17 00:00:00 2001 From: "Khoa (Revenovich) Tran Gia" Date: Tue, 3 Mar 2026 11:52:44 +0700 Subject: [PATCH] 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 " 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 --- bot.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/bot.py b/bot.py index bdc5cb7..370b4e1 100644 --- a/bot.py +++ b/bot.py @@ -40,6 +40,26 @@ except Exception: logging.basicConfig(level=logging.INFO) 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 @@ -192,6 +212,11 @@ async def main() -> None: loop="none", # use existing event loop ) 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()) logger.info( "Web UI enabled at http://%s:%d", config.web_host, config.web_port