Nettoyage

Les journaux d'audit grossissent avec le temps. Les cadres réglementaires comme le RGPD encouragent la minimisation des données — ne conserver les données que tant qu'elles servent un objectif légitime. La commande audit:prune supprime les journaux d'audit plus anciens qu'une période de rétention configurable, gardant votre base de données légère sans intervention manuelle.

Utilisation de base

php artisan audit:prune

Cette commande supprime les journaux d'audit légers (non chaînés, où hash IS NULL) plus anciens que la période de rétention configurée (par défaut : 90 jours). Par défaut, les logs chaînés (HasAuditTrail) sont exclus de la purge pour préserver l'intégrité de la chaîne de hash. La commande demande une confirmation avant de procéder à la suppression.

Configuration

Définissez la période de rétention par défaut dans config/audit-chain.php :

'retention' => [
    'days' => 90,
],

Options de la commande

Période de rétention personnalisée

Remplacez la période de rétention configurée avec le flag --days :

# Ne conserver que les 30 derniers jours
php artisan audit:prune --days=30

# Conserver une année complète
php artisan audit:prune --days=365

Filtrer par type de model

Nettoyez les journaux pour un model spécifique uniquement, en laissant les autres journaux d'audit intacts :

php artisan audit:prune --type="App\Models\PageView"

C'est utile lorsque différents models ont des exigences de rétention différentes — vous pourriez conserver les journaux de transactions financières pendant 7 ans mais nettoyer les journaux de pages vues après 30 jours.

Inclure les logs chaînés

Par défaut, audit:prune ne supprime que les logs légers (sans chaîne de hash). Pour purger également les logs chaînés, utilisez le flag --include-chained. Cela nécessite le flag --force et affiche un avertissement, car la suppression de logs chaînés affecte la vérification de la chaîne :

php artisan audit:prune --days=365 --include-chained --force

Lorsque des logs chaînés sont purgés, le hash du dernier log supprimé est enregistré dans la colonne audit_chain_state.checkpoint_hash. Ce checkpoint sert de point de départ pour les futures vérifications de chaîne — permettant à audit:verify de reprendre là où la chaîne purgée s'est arrêtée au lieu d'échouer sur la première entrée.

Forcer la suppression

Ignorez l'invite de confirmation avec --force. Requis lors de l'utilisation de --include-chained :

php artisan audit:prune --force

Combiner les flags

php artisan audit:prune --days=30 --type="App\Models\PageView"
php artisan audit:prune --days=365 --include-chained --force

Fonctionnement

La commande supprime les enregistrements par lots de 1 000 pour éviter de verrouiller la table de la base de données pendant de longues périodes. C'est sûr pour les grandes tables avec des millions de journaux d'audit — la commande supprime progressivement les lots jusqu'à ce que tous les enregistrements correspondants soient supprimés.

$ php artisan audit:prune --days=90 --no-interaction
About to delete 15,234 audit log(s) older than 90 day(s).
  Deleted 1000 / 15234...
  Deleted 2000 / 15234...
  ...
  Deleted 15234 / 15234...
Pruned 15234 audit log(s).

Si aucun journal ne correspond aux critères de rétention, la commande se termine proprement :

No audit logs older than 90 day(s) found.

Planification

Pour un nettoyage automatisé, planifiez la commande de nettoyage dans routes/console.php :

Schedule::command('audit:prune')->daily();

Consultez Planification pour une configuration cron complète.

Choisir une période de rétention

Votre période de rétention dépend de vos exigences de conformité :

Réglementation Rétention typique
RGPD Aussi courte que justifiable (principe de minimisation des données)
SOX 7 ans
HIPAA 6 ans
PCI DSS 1 an
NIS2 Pas de minimum spécifique, mais suffisant pour l'investigation des incidents

Définissez retention.days pour satisfaire votre obligation la plus exigeante. Utilisez le flag --type et la planification pour appliquer des périodes de rétention différentes à différents models.