eptm_dashboard/docs/08-logs.md

85 lines
2.9 KiB
Markdown

# Logs & audit
## Page : `/logs` (admin)
Affiche en temps réel le contenu de `data/logs/operations.log` avec un mode **prod** (lignes principales) et un mode **debug** (lignes indentées détaillées).
## Format des logs
```
[14:32:01] [abs] prof.demo : Dupont Marc (1MAB1) — 04.02.2026 P6 : N → E
[14:32:08] Sync Escada démarrée par prof.demo — 3 classe(s) [abs/forcé, BN] : 1MAB1, 2EM1, 1MAB2
[14:32:15] [sync] Connexion Escadaweb OK
[14:34:42] [sync] Téléchargement absences 1MAB1 (4.2 MB)
[14:35:01] ALL_DONE confirme — phase import
[14:35:30] Résultats chargés — sync terminée OK
```
- Lignes **non indentées** : événements importants (sync démarrée/terminée, modif d'absence, action admin)
- Lignes **indentées** (avec deux espaces) : sortie verbeuse des sous-processus Selenium / parser PDF — visibles uniquement en mode debug
## Catégories d'événements tracés
### Modifications de données
| Préfixe | Événement |
|-----------|----------------------------------------|
| `[abs]` | Modification d'absence (qui, quel apprenti, quelle période, ancien → nouveau type) |
| `[cron]` | Création / édition / activation / suppression d'une tâche planifiée |
### Opérations Escada manuelles
- `Rafraîchissement liste classes Escada par {user}`
- `Sync Escada démarrée par {user} — N classe(s) [options] : ...`
- `Push Escada démarré par {user}`
- `Push terminé — ok:N erreurs:M`
### Sous-processus
- `[refresh]`, `[sync]`, `[push]` : sortie standard du subprocess Selenium correspondant
### Cron automatique
- `[run_imports] démarré`
- `[run_imports] abs CLASSE: N nouv / N modif / ...`
- `[run_imports] terminé OK`
## Localisation physique
- **App** : `/opt/eptm-dashboard/data/logs/operations.log` (ligne par ligne, append-only)
- **Cron jobs** : `/logs/cron/cron-{job_id}-{timestamp}.log` (un fichier par exécution, persistant via bind mount Docker)
## Rotation
Pas de rotation automatique pour l'instant. À long terme :
```bash
# Garder les 30 derniers jours
find data/logs/ -name "operations.log" -mtime +30 -delete
```
## Filtrer / chercher
Sur la page `/logs` :
- Recherche texte simple
- Filtre par date
- Toggle prod/debug
En CLI :
```bash
docker exec eptm-dashboard-app-1 grep -i "force" data/logs/operations.log | tail -50
docker exec eptm-dashboard-app-1 grep "\[abs\] prof.demo" data/logs/operations.log
```
## Champ `updated_by` côté DB
Indépendamment de `operations.log`, chaque table sensible stocke directement qui a fait quoi :
| Table | Champ |
|--------------|--------------------------------|
| `Absence` | `updated_by`, `updated_at` |
| `Import` | `imported_by` |
| `ImportBN` | `imported_by` |
| `ImportMatu` | `imported_by` |
Permet de retrouver l'historique même si le log fichier est supprimé.