feat: 重构接口日志页面与接口监控看板,支持HTTP方法过滤和实时轮询

This commit is contained in:
liumangmang
2026-07-01 15:04:32 +08:00
parent 397a14c978
commit 8abfa4c5ef
19 changed files with 2463 additions and 37 deletions
@@ -0,0 +1,74 @@
"""Log external API calls to the database and console."""
from __future__ import annotations
import logging
from datetime import datetime, timezone
from typing import Optional
from app.database import SessionLocal
from app.models.external_api_log import ExternalApiLog
logger = logging.getLogger(__name__)
def log_external_api_call(
direction: str,
target_type: str,
method: str,
path: str,
url_host: str,
duration_ms: int,
status_code: Optional[int] = None,
success: bool = True,
target_id: Optional[int] = None,
target_name: Optional[str] = None,
error_type: Optional[str] = None,
error_message: Optional[str] = None,
) -> None:
"""Persist an external API call log entry and write a structured console log.
No request/response bodies, tokens, cookies, or API keys are recorded.
"""
# Console log (structured, for Docker log aggregation)
logger.info(
"api_log direction=%s target_type=%s target_id=%s target_name=%s "
"method=%s path=%s url_host=%s status_code=%s success=%s "
"duration_ms=%d error_type=%s error_message=%s",
direction,
target_type,
target_id,
target_name or "",
method,
path,
url_host,
status_code or "",
success,
duration_ms,
error_type or "",
(error_message or "")[:200],
)
# DB persistence
db = SessionLocal()
try:
log = ExternalApiLog(
direction=direction,
target_type=target_type,
target_id=target_id,
target_name=target_name,
method=method,
path=path,
url_host=url_host,
status_code=status_code,
success=success,
duration_ms=duration_ms,
error_type=error_type,
error_message=error_message,
created_at=datetime.now(timezone.utc),
)
db.add(log)
db.commit()
except Exception:
logger.exception("failed to persist external API log entry")
finally:
db.close()