eptm_dashboard/docs/08-logs.md

2.9 KiB

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 :

# 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 :

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