85 lines
2.9 KiB
Markdown
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é.
|