feat(admin): 行为日志记录 hub_id(便于区分不同中枢)
This commit is contained in:
@@ -26,14 +26,18 @@ def _today() -> str:
|
||||
|
||||
|
||||
class LogWriter:
|
||||
def __init__(self, log_dir: str, retention_days: int = 0) -> None:
|
||||
def __init__(self, log_dir: str, retention_days: int = 0, hub_id: str = "") -> None:
|
||||
self.log_dir = Path(log_dir)
|
||||
self.retention_days = retention_days
|
||||
self.hub_id = hub_id
|
||||
self._queue: asyncio.Queue[dict[str, Any]] = asyncio.Queue(maxsize=20000)
|
||||
self._task: asyncio.Task | None = None
|
||||
self._date = ""
|
||||
self._fh = None
|
||||
|
||||
def set_hub_id(self, hub_id: str) -> None:
|
||||
self.hub_id = hub_id or ""
|
||||
|
||||
async def start(self) -> None:
|
||||
self.log_dir.mkdir(parents=True, exist_ok=True)
|
||||
self._task = asyncio.create_task(self._run())
|
||||
@@ -111,9 +115,9 @@ class LogWriter:
|
||||
logger.exception("日志清理失败")
|
||||
|
||||
|
||||
def init_writer(log_dir: str, retention_days: int = 0) -> None:
|
||||
def init_writer(log_dir: str, retention_days: int = 0, hub_id: str = "") -> None:
|
||||
global _writer
|
||||
_writer = LogWriter(log_dir, retention_days)
|
||||
_writer = LogWriter(log_dir, retention_days, hub_id=hub_id)
|
||||
|
||||
|
||||
async def start_writer() -> None:
|
||||
@@ -143,6 +147,7 @@ def log_event(
|
||||
return
|
||||
entry = {
|
||||
"ts": _now_iso(),
|
||||
"hub_id": _writer.hub_id,
|
||||
"user_id": user_id,
|
||||
"event": event,
|
||||
"method": method,
|
||||
|
||||
+4
-2
@@ -32,6 +32,7 @@ from .routers import admin
|
||||
from . import logwriter
|
||||
from .auth import AuthError
|
||||
from .services.auth import seed_admin
|
||||
from .services.settings import get_hub_settings
|
||||
from .upstream import close_client
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
@@ -109,9 +110,10 @@ def create_app() -> FastAPI:
|
||||
@asynccontextmanager
|
||||
async def _lifespan(_app: FastAPI):
|
||||
_db = await init_db()
|
||||
logwriter.init_writer(settings.log_dir, settings.log_retention_days)
|
||||
await logwriter.start_writer()
|
||||
await seed_admin(_db)
|
||||
hub = await get_hub_settings(_db)
|
||||
logwriter.init_writer(settings.log_dir, settings.log_retention_days, hub_id=hub["hub_id"])
|
||||
await logwriter.start_writer()
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
|
||||
@@ -9,6 +9,7 @@ from ..auth import require_admin
|
||||
from ..config import get_settings
|
||||
from ..db import Database, get_db
|
||||
from ..logwriter import log_event
|
||||
from .. import logwriter
|
||||
from ..services.auth import (
|
||||
AUTHORIZATION_UNITS,
|
||||
verify_login,
|
||||
@@ -92,7 +93,9 @@ async def get_settings_api(db: Database = Depends(get_db), _user: dict = Depends
|
||||
|
||||
@router.put("/settings")
|
||||
async def put_settings_api(body: HubSettingsBody, db: Database = Depends(get_db), _user: dict = Depends(require_admin)):
|
||||
return {"ok": True, "settings": await set_hub_settings(db, body.hub_id, body.hub_name)}
|
||||
settings = await set_hub_settings(db, body.hub_id, body.hub_name)
|
||||
logwriter.set_hub_id(settings["hub_id"])
|
||||
return {"ok": True, "settings": settings}
|
||||
|
||||
|
||||
@router.get("/users")
|
||||
|
||||
Reference in New Issue
Block a user