llmproxy/docs/superpowers/specs/2026-05-10-log-viewer-autoreload-design.md

68 lines
2.1 KiB
Markdown

# Design: Log-Viewer und Auto-Reload in der Admin-Oberfläche
## Kontext
Die Admin-Oberfläche zeigt aktuell nur API-Keys und Einstellungen. Es gibt kein automatisches Aktualisieren und keinen Zugriff auf die Logdateien. Hauptbedürfnis: Das aktuell geladene Ollama-Modell schnell im Blick haben, ohne manuell neu laden zu müssen.
## Scope
- Letzten 10 Zeilen von `usage.log` und `error.log` in der Settings-Sektion anzeigen
- Alle Daten (Keys, Settings, Logs) alle 5 Minuten automatisch neu laden
- Zeitstempel der letzten Aktualisierung anzeigen
---
## Backend
### Neuer Endpunkt: `GET /api/logs/{name}`
**Datei:** `backend/admin.py`
**Parameter:** `name``usage` oder `error` (andere Werte → 400)
**Verhalten:**
- Leitet den Pfad aus `LOG_FILE` (Env-Var, Default: `logs/usage.log`) ab
- `error` → selbes Verzeichnis, Dateiname `error.log`
- Liest die letzten 10 Zeilen der Datei
- Gibt `{"lines": ["...", ...]}` zurück
- Datei nicht vorhanden → leeres Array `{"lines": []}`
- Geschützt durch `require_admin_auth`
---
## Frontend
### Log-Anzeige in `SettingsSection`
**Datei:** `frontend/src/main.jsx`
- Neuer Unterabschnitt am Ende der Settings-Karte
- Zwei `<pre>`-Blöcke: `usage.log` (immer) und `error.log` (nur wenn nicht leer)
- Stil konsistent mit bestehenden Settings-Elementen (dunkler Hintergrund, Monospace-Font)
- Daten werden beim Mount von `SettingsSection` zusammen mit den übrigen Settings geladen
### Auto-Reload
- `setInterval` im `App`-Component, Intervall: **5 Minuten (300 000 ms)**
- Ruft dieselben Fetch-Funktionen auf wie beim Login: Keys + Settings + Logs
- Timer wird beim Unmount (Logout) via `clearInterval` bereinigt
- Oben rechts in der eingeloggten UI: kleiner Hinweis „Zuletzt aktualisiert: HH:MM"
---
## Nicht im Scope
- Live-Streaming / WebSocket
- Filterung oder Suche in Logs
- Konfigurierbare Zeilenzahl (fest: 10)
- Automatisches Scrollen
---
## Tests
- `GET /api/logs/usage` gibt die letzten 10 Zeilen zurück
- `GET /api/logs/error` gibt leeres Array zurück wenn Datei nicht existiert
- `GET /api/logs/invalid` gibt 400 zurück
- Manueller Test: Admin-UI öffnen, 5 Minuten warten, Timestamp prüfen