Skip to content

Commit 17bb826

Browse files
CCoupelclaude
andcommitted
feat(logs): Add real-time server logs page with dedicated WebSocket
New features: - Dedicated WebSocket endpoint /ws/logs for optimized log streaming - LogsPage with level/component filters and real-time search - Thread-safe circular buffer (1000 entries) - Intelligent auto-scroll with pause on manual interaction - Export logs to .log file Technical: - Separation of concerns: /ws for game, /ws/logs for logging - LOG_HISTORY (initial snapshot) + LOG_ENTRY (real-time) messages - Dedicated hook useLogsWebSocket() for logs connection - Fixed layout with sticky toolbar and scrollable log list Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent c1083ec commit 17bb826

22 files changed

Lines changed: 1940 additions & 182 deletions

CHANGELOG.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,66 @@
33
Historique des versions du projet BuzzControl.
44

55

6+
## [2.43.0] - 2026-01-26
7+
8+
### Ajouts
9+
- **[Logs]**: WebSocket dédiée `/ws/logs` pour une gestion optimisée des logs
10+
- **Séparation des WebSockets** : `/ws` pour le jeu, `/ws/logs` pour les logs
11+
- **Connexion directe** : LogsPage se connecte à `/ws/logs` au lieu de `/ws`
12+
- **Messages dédiés** : LOG_HISTORY (historique à la connexion), LOG_ENTRY (temps réel)
13+
- **Pas de conflit** : Les logs ne transitent plus par la WebSocket de jeu
14+
15+
### Modifié
16+
- **[LogsPage]**: Utilise `connectToLogs()` au lieu de `connect()`
17+
- Hook personnalisé pour gérer la WebSocket `/ws/logs`
18+
- Subscription/unsubscription automatique
19+
20+
### Corrigé
21+
- **[LogsPage]**: Layout avec position fixed et scroll interne
22+
- Page fixe sans scroll global (`.logs-page { position: fixed }`)
23+
- Toolbar sticky en haut (`.logs-toolbar { position: sticky, z-index: 10 }`)
24+
- Liste des logs scrollable (`.logs-list { flex: 1, overflow-y: auto }`)
25+
26+
### Technique
27+
- `websocket.go` : Nouvelle fonction `ServeLogsWS()` pour `/ws/logs`
28+
- `main.go` : Handler `/ws/logs`, `ConnectToLogs()`, `DisconnectFromLogs()`
29+
- `LogsPage.jsx` : Hook `useLogsWebSocket()` avec connexion dédiée
30+
- `LogsPage.css` : Structure flexbox avec position fixed
31+
- `useWebSocket.js` : Suppression handlers LOG_HISTORY et LOG_ENTRY (déplacés vers useLogsWebSocket)
32+
33+
---
34+
35+
## [2.42.0] - 2026-01-26
36+
37+
### Ajouts
38+
- **[Logs]**: Page de visualisation des logs serveur en temps reel
39+
- **Route `/admin/logs` et `/anim/logs`** : Nouvelle page d'administration
40+
- **LogBuffer** : Buffer circulaire thread-safe (capacite 1000 logs)
41+
- **BroadcastLogger** : Logger avec diffusion temps reel via WebSocket
42+
- **Filtres de niveau** : DEBUG (gris), INFO (blanc), WARN (orange), ERROR (rouge)
43+
- **Filtres de composant** : App, Engine, HTTP, WebSocket, TCP, UDP
44+
- **Recherche temps reel** : Debounce 300ms avec highlight des termes
45+
- **Auto-scroll intelligent** : Pause automatique au scroll manuel, reprise en bas
46+
- **Indicateur nouveaux logs** : Badge flottant cliquable pour descendre
47+
- **Export** : Telechargement des logs filtres au format `.log`
48+
49+
### Technique
50+
- `models.go` : Structs `LogLevel`, `LogComponent`, `LogEntry`
51+
- `logbuffer.go` : `LogBuffer` avec `Add()`, `GetAll()`, `GetRecent()`
52+
- `logger.go` : `BroadcastLogger` avec `Debug()`, `Info()`, `Warn()`, `Error()`
53+
- `websocket.go` : `SubscribeToLogs()`, `UnsubscribeFromLogs()`, `BroadcastToLogSubscribers()`
54+
- `messages.go` : Actions `SUBSCRIBE_LOGS`, `UNSUBSCRIBE_LOGS`, `LOG_HISTORY`, `LOG_ENTRY`
55+
- `main.go` : Handlers et integration du logger
56+
- `LogsPage.jsx` : Page principale avec toolbar et liste de logs
57+
- `LogEntry.jsx` : Composant d'affichage d'une ligne de log
58+
- `useWebSocket.js` : Handlers `LOG_HISTORY`, `LOG_ENTRY`, fonctions `subscribeLogs`, `unsubscribeLogs`
59+
- `Navbar.jsx` : Lien "Logs" dans la section Config
60+
61+
### Tests
62+
- `logbuffer_test.go` : Tests unitaires pour LogBuffer (Add, Circular, Concurrency, GetRecent)
63+
64+
---
65+
666
## [2.41.0] - 2026-01-25
767

868
### Ajouts

CLAUDE.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,35 @@ Page d'historique des événements de jeu :
773773
- **Badge catégorie** : Icône colorée par groupe dans l'historique (v2.23.0)
774774
- **Fichiers** : `HistoryPage.jsx`, `HistoryPage.css`, `engine.go:AddGameEvent()`
775775

776+
#### Logs Page (v2.42.0)
777+
Page de visualisation des logs serveur en temps reel :
778+
- **Route** : `/admin/logs` et `/anim/logs`
779+
- **Fonctionnalites** :
780+
- Affichage temps reel des logs via WebSocket dediee
781+
- Filtrage par niveau : DEBUG (gris), INFO (blanc), WARN (orange), ERROR (rouge)
782+
- Filtrage par composant : App, Engine, HTTP, WebSocket, TCP, UDP
783+
- Recherche avec debounce 300ms et highlight des termes
784+
- Auto-scroll intelligent (pause au scroll manuel, reprise en bas)
785+
- Export des logs filtres au format `.log`
786+
- **Backend** :
787+
- `LogBuffer` : Buffer circulaire thread-safe (1000 logs max)
788+
- `BroadcastLogger` : Logger avec diffusion temps reel
789+
- **WebSocket dediee** : `/ws/logs` (separee de `/ws` pour le jeu)
790+
- **Architecture WebSocket Logs** (v2.43.0) :
791+
- **Endpoint** : `/ws/logs` (WebSocket dediee, independante de `/ws`)
792+
- **Connexion** : Le client se connecte → recoit automatiquement `LOG_HISTORY`
793+
- **Temps reel** : Chaque nouveau log est envoye via `LOG_ENTRY`
794+
- **Deconnexion** : Fermer la WebSocket = desabonnement (pas d'action explicite)
795+
- **Avantages** : Pas de gestion d'abonnement, isolation du trafic logs/jeu
796+
- **Messages WebSocket** :
797+
| Message | Direction | Description |
798+
|---------|-----------|-------------|
799+
| `LOG_HISTORY` | Server->Client | Historique complet a la connexion |
800+
| `LOG_ENTRY` | Server->Client | Nouveau log temps reel |
801+
- **Fichiers** :
802+
- Backend : `logbuffer.go`, `logger.go`, `logswebsocket.go` (nouveau)
803+
- Frontend : `LogsPage.jsx`, `LogsPage.css`, `LogEntry.jsx`, `LogEntry.css`
804+
776805
#### CategoryBalance Component (v2.23.0)
777806
Visualisation de l'équilibre des catégories sur la page Questions :
778807
- **Location** : `components/CategoryBalance.jsx` + `components/CategoryBalance.css`

backlog/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Chaque fichier correspond à une fonctionnalité ou un ensemble de fonctionnalit
1818
| [memory-game.md](memory-game.md) | ✅ v2.33.0 | Jeu de mémoire avec paires |
1919
| [mode-demo.md](mode-demo.md) | ✅ v2.40.0 | Mode démonstration avec données complètes |
2020
| [page-joueur.md](page-joueur.md) | ✅ v2.41.0 | Interface personnalisée pour jouer depuis smartphone |
21-
| [page-logs.md](page-logs.md) | 📋 Planifié | Affichage des logs serveur en temps réel |
21+
| [page-logs.md](page-logs.md) | ✅ v2.42.0 | Affichage des logs serveur en temps réel |
2222
| [tri-rapidite-reponse.md](tri-rapidite-reponse.md) | 📋 Planifié | Tri équipes/joueurs par rapidité de buzz |
2323
| [generateur-ia.md](generateur-ia.md) | 📋 Planifié | Générateur de jeu complet via IA |
2424

@@ -66,6 +66,7 @@ vX.Y.Z
6666

6767
## Historique
6868

69+
- 2026-01-26 : Completion page logs (v2.42.0)
6970
- 2026-01-25 : Ajout tri équipes/joueurs par rapidité de buzz (📋 Planifié, priorité haute)
7071
- 2026-01-25 : Ajout marqueurs indices QCM sur barre de temps (📋 Planifié)
7172
- 2026-01-25 : Ajout de la page logs (📋 Planifié)

backlog/page-logs.md

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
# Page Logs (/logs)
22

3-
**Statut** : 📋 Planifié
3+
**Statut** : Implemente v2.42.0
44

55
## Description
66

77
Une page `/logs` dans l'interface admin pour afficher les logs du serveur en temps réel. Cette page permet à l'animateur et aux administrateurs de surveiller l'activité du serveur, diagnostiquer les problèmes et comprendre le flux des événements.
88

99
## Objectifs
1010

11-
- [ ] Afficher les logs du serveur Go en temps réel via WebSocket
12-
- [ ] Filtrer les logs par niveau (DEBUG, INFO, WARN, ERROR)
13-
- [ ] Filtrer les logs par composant (Engine, HTTP, WebSocket, TCP)
14-
- [ ] Permettre la recherche dans les logs
15-
- [ ] Auto-scroll avec pause au survol
16-
- [ ] Export des logs visibles
11+
- [x] Afficher les logs du serveur Go en temps réel via WebSocket
12+
- [x] Filtrer les logs par niveau (DEBUG, INFO, WARN, ERROR)
13+
- [x] Filtrer les logs par composant (Engine, HTTP, WebSocket, TCP, UDP, App)
14+
- [x] Permettre la recherche dans les logs
15+
- [x] Auto-scroll avec pause au survol
16+
- [x] Export des logs visibles
1717

1818
## Architecture
1919

@@ -59,60 +59,61 @@ Page admin avec affichage des logs en temps réel.
5959

6060
### Phase 1 - Backend (v2.42.0)
6161

62-
- [ ] **LogBuffer** : Buffer circulaire pour stocker les derniers 1000 logs
62+
- [x] **LogBuffer** : Buffer circulaire pour stocker les derniers 1000 logs
6363
- Struct `LogEntry` : Timestamp, Level, Component, Message
6464
- Thread-safe avec mutex
6565
- Méthode `GetRecent(n int)` pour récupérer les n derniers logs
6666

67-
- [ ] **LogBroadcaster** : Broadcast des logs vers les clients WebSocket
67+
- [x] **LogBroadcaster** : Broadcast des logs vers les clients WebSocket
6868
- Canal Go pour recevoir les nouveaux logs
6969
- Action WebSocket `LOG_ENTRY` pour envoyer un log
7070
- Action WebSocket `LOG_HISTORY` pour envoyer l'historique initial
7171

72-
- [ ] **Intégration CustomLogger** : Connecter le logger existant au buffer
72+
- [x] **Intégration CustomLogger** : Connecter le logger existant au buffer
7373
- Hook pour capturer chaque log
7474
- Parsing du niveau et du composant
7575

76-
- [ ] **Action WebSocket SUBSCRIBE_LOGS** : Client demande à recevoir les logs
77-
- Envoie l'historique récent (100 derniers)
76+
- [x] **Action WebSocket SUBSCRIBE_LOGS** : Client demande à recevoir les logs
77+
- Envoie l'historique récent (tous les logs du buffer)
7878
- Ajoute le client à la liste des abonnés
7979

80-
- [ ] **Action WebSocket UNSUBSCRIBE_LOGS** : Client arrête de recevoir les logs
80+
- [x] **Action WebSocket UNSUBSCRIBE_LOGS** : Client arrête de recevoir les logs
8181
- Retire le client de la liste des abonnés
8282

8383
### Phase 2 - Frontend (v2.42.0)
8484

85-
- [ ] **LogsPage.jsx** : Page principale d'affichage des logs
85+
- [x] **LogsPage.jsx** : Page principale d'affichage des logs
8686
- Route `/admin/logs` et `/anim/logs`
8787
- Connexion WebSocket pour recevoir les logs
88-
- État local pour stocker les logs reçus (max 5000)
88+
- État local pour stocker les logs reçus
8989

90-
- [ ] **Composant LogEntry** : Affichage d'une ligne de log
90+
- [x] **Composant LogEntry** : Affichage d'une ligne de log
9191
- Couleur selon le niveau (DEBUG=gris, INFO=blanc, WARN=orange, ERROR=rouge)
9292
- Badge coloré pour le composant
9393
- Timestamp formaté (HH:MM:SS.mmm)
9494
- Message avec highlight de la recherche
9595

96-
- [ ] **Filtres de niveau** : Boutons toggle pour chaque niveau
96+
- [x] **Filtres de niveau** : Boutons toggle pour chaque niveau
9797
- DEBUG, INFO, WARN, ERROR
9898
- Filtrage côté client (tous les logs reçus, filtrés à l'affichage)
9999

100-
- [ ] **Filtre de composant** : Dropdown pour filtrer par composant
101-
- Options : Tous, Engine, HTTP, WebSocket, TCP, UDP
102-
- Extraction automatique des composants depuis les logs
100+
- [x] **Filtre de composant** : Boutons toggle pour filtrer par composant
101+
- Options : App, Engine, HTTP, WebSocket, TCP, UDP
102+
- Sélection multiple
103103

104-
- [ ] **Recherche** : Input de recherche temps réel
104+
- [x] **Recherche** : Input de recherche temps réel
105105
- Filtre sur le message du log
106106
- Highlight des termes trouvés
107107
- Debounce 300ms
108108

109-
- [ ] **Auto-scroll** : Scroll automatique vers le bas
110-
- Checkbox pour activer/désactiver
109+
- [x] **Auto-scroll** : Scroll automatique vers le bas
110+
- Bouton pour activer/désactiver
111111
- Pause automatique si l'utilisateur scroll manuellement
112112
- Reprise si scroll en bas
113+
- Indicateur visuel pour nouveaux logs
113114

114-
- [ ] **Export** : Bouton pour exporter les logs visibles
115-
- Format texte avec timestamp
115+
- [x] **Export** : Bouton pour exporter les logs visibles
116+
- Format texte avec timestamp ISO
116117
- Téléchargement fichier `.log`
117118

118119
### Phase 3 - Améliorations (v2.43.0)

0 commit comments

Comments
 (0)