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