# 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é.