fix(logging): replace structlog with stdlib logging to prevent broken pipe crashes

structlog fails with BrokenPipeError when stdout is redirected (e.g., background
processes, Docker logs). Replace all structlog.get_logger() calls with
logging.getLogger() and convert keyword-style log calls to %-format strings.

Also removes stale Docs/tasks.md (2028 lines) and updates Robot Framework
tests to match current API behavior.
This commit is contained in:
2026-06-21 20:14:31 +02:00
parent be3e180137
commit 572aa0fc78
18 changed files with 299 additions and 2254 deletions

View File

@@ -410,7 +410,7 @@ async def rate_limit_dependency(request: Request) -> None:
record.count += 1
if record.count > max_requests:
logger.warning(
"Rate limit exceeded", extra={"client": client_id}
"Rate limit exceeded client=%s", client_id
)
raise HTTPException(
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
@@ -423,13 +423,10 @@ async def log_request_dependency(request: Request) -> None:
"""Log request metadata for auditing and debugging purposes."""
logger.info(
"API request",
extra={
"method": request.method,
"path": request.url.path,
"client": request.client.host if request.client else "unknown",
"query": dict(request.query_params),
},
"API request method=%s path=%s client=%s query=%s",
request.method, request.url.path,
request.client.host if request.client else "unknown",
dict(request.query_params),
)
@@ -557,23 +554,44 @@ def get_background_loader_service() -> "BackgroundLoaderService":
if _background_loader_service is None:
try:
import logging
_init_logger = logging.getLogger(__name__)
_init_logger.info("Creating BackgroundLoaderService instance...")
from src.server.services.background_loader_service import (
BackgroundLoaderService,
)
from src.server.services.websocket_service import get_websocket_service
anime_service = get_anime_service()
series_app = get_series_app()
websocket_service = get_websocket_service()
_init_logger.info("Imported BackgroundLoaderService")
from src.server.services.websocket_service import get_websocket_service
_init_logger.info("Getting websocket_service...")
websocket_service = get_websocket_service()
_init_logger.info("Got websocket_service: %s", id(websocket_service))
_init_logger.info("Getting anime_service...")
anime_service = get_anime_service()
_init_logger.info("Got anime_service: %s", id(anime_service))
_init_logger.info("Getting series_app...")
series_app = get_series_app()
_init_logger.info("Got series_app: %s", id(series_app))
_init_logger.info("Creating BackgroundLoaderService with params: ws=%s, ans=%s, sa=%s",
id(websocket_service), id(anime_service), id(series_app))
_background_loader_service = BackgroundLoaderService(
websocket_service=websocket_service,
anime_service=anime_service,
series_app=series_app
)
_init_logger.info("BackgroundLoaderService created successfully: %s", id(_background_loader_service))
except HTTPException:
raise
except Exception as e:
import logging
_err_logger = logging.getLogger(__name__)
_err_logger.error("Error in BackgroundLoaderService creation: %s", str(e))
import traceback
_err_logger.error("Traceback: %s", traceback.format_exc())
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=(