Audit log dans Laravel : comment la traçabilité transforme votre SaaS en solution Enterprise
Tout SaaS atteint un moment charnière : « Qui a modifié ce paramètre ? » cesse d'être une question anodine pour devenir un ticket de support, voire un blocage commercial. Un collaborateur supprime un projet, un accès disparaît sans explication, une configuration change silencieusement — sans audit log, vous naviguez à l'aveugle.
Dans les cycles de vente Enterprise, l'absence de traçabilité des actions est souvent un critère éliminatoire. À l'inverse, un journal d'audit solide renforce la confiance, facilite la conformité (RGPD, SOC 2, ISO 27001) et positionne votre produit comme une solution sérieuse. Ce guide s'appuie sur l'article original de Hafiz sur dev.to pour construire un système d'audit complet avec spatie/laravel-activitylog v5.
Ce qui change avec spatie/laravel-activitylog v5
Avec plus de 48 millions d'installations sur Packagist, spatie/laravel-activitylog est la référence de l'écosystème Laravel pour la journalisation des activités. La version 5, publiée fin mars 2026, apporte des changements structurants :
- PHP 8.4+ requis : la bibliothèque profite pleinement des dernières fonctionnalités du langage.
- Moins de boilerplate : en v4, utiliser le trait
LogsActivityimposait de définirgetActivitylogOptions()même pour les cas les plus simples. En v5, le trait seul suffit pour démarrer. La méthode n'est à surcharger que pour un comportement personnalisé. - Nouvelle colonne
attribute_changes: remplace l'ancienne colonnechanges, avec un typage plus strict et une structure plus prévisible. - Internals swappables : les composants internes sont désormais remplaçables via l'injection de dépendances, ce qui facilite les personnalisations avancées sans forker le package.
Si vous êtes déjà en v4, une section de migration est disponible dans l'article source.
Mise en place : installation et configuration
composer require spatie/laravel-activitylog
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
php artisan migrate
La migration crée la table activity_log avec les colonnes nécessaires, dont la nouvelle attribute_changes.
Pour activer la journalisation automatique sur un modèle Eloquent, il suffit désormais d'ajouter le trait :
use Spatie\Activitylog\Traits\LogsActivity;
class Project extends Model
{
use LogsActivity;
}
En v5, cette ligne seule enregistre les créations, modifications et suppressions du modèle. Pour affiner le comportement — choisir les attributs suivis, personnaliser le nom du log, ignorer certains événements — on surcharge getActivitylogOptions() :
use Spatie\Activitylog\LogOptions;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['name', 'status', 'assigned_to'])
->logOnlyDirty()
->dontSubmitEmptyLogs()
->setDescriptionForEvent(fn(string $eventName) => "Projet {$eventName}");
}
logOnlyDirty() et dontSubmitEmptyLogs() sont deux options particulièrement utiles en production : elles évitent de polluer le journal avec des sauvegardes sans changement réel.
Journalisation manuelle et contexte métier
La journalisation automatique couvre les opérations CRUD, mais un audit log pertinent va plus loin. Certaines actions métier — invitation d'un utilisateur, export de données, changement de plan — méritent d'être tracées explicitement :
activity()
->causedBy(auth()->user())
->performedOn($subscription)
->withProperties([
'old_plan' => $subscription->plan,
'new_plan' => $newPlan,
'reason' => $request->reason,
])
->log('plan_downgraded');
Le nom du log (causedBy, performedOn, withProperties) constitue un contexte précieux pour les équipes support et les auditeurs. Structurer ces entrées dès le départ évite de devoir reconstituer l'historique a posteriori.
Pour les applications multi-tenant, il est conseillé d'associer systématiquement le tenant_id dans les propriétés ou via un scope global, afin d'isoler les journaux par organisation.
Afficher le journal dans Filament
Un audit log n'a de valeur que s'il est consultable. L'article source détaille l'intégration avec Filament, le panel d'administration Laravel, pour afficher les activités sous forme de tableau filtrable.
L'approche recommandée est de créer une Resource Filament dédiée au modèle Activity de Spatie :
use Spatie\Activitylog\Models\Activity;
class ActivityResource extends Resource
{
protected static ?string $model = Activity::class;
// ...
}
Dans la table Filament, on peut exposer : la date, l'utilisateur responsable (causer), le modèle concerné (subject), l'événement, et les propriétés modifiées. Un filtre par date et par type d'événement rend l'interface exploitable même avec des volumes importants.
Pour les équipes Enterprise, présenter cette interface directement dans le produit — avec contrôle d'accès par rôle — est un argument commercial concret lors des démonstrations.
L'audit log comme levier de vente
Au-delà de l'aspect technique, implémenter un audit log change la conversation commerciale. Voici quelques situations concrètes :
- Conformité réglementaire : un DPO ou RSSI demande à voir qui a accédé à quelles données et quand. Avec un journal structuré, la réponse est immédiate.
- Résolution de litiges : un client conteste une modification. Le log fournit une preuve horodatée et non ambiguë.
- Onboarding Enterprise : les questionnaires de sécurité des grands comptes incluent systématiquement des questions sur la traçabilité des actions administrateurs.
- Confiance des équipes : en interne, savoir que les actions sont enregistrées responsabilise les utilisateurs et réduit les erreurs accidentelles.
L'investissement technique est modeste — quelques heures pour une intégration propre. Le retour, lui, se mesure en deals débloqués et en support simplifié.
Conclusion
spatie/laravel-activitylog v5 rend l'implémentation d'un audit log à la fois simple et robuste pour les applications Laravel. Moins de boilerplate, une API plus claire, des internals extensibles : les fondations sont saines pour construire un système de traçabilité qui grandit avec votre produit.
Si vous développez un SaaS avec des ambitions Enterprise, l'audit log n'est pas une fonctionnalité secondaire. C'est un signal de maturité produit — et souvent, le détail qui fait la différence dans une négociation commerciale.
📖 Article original : Building an Audit Log in Laravel with spatie/laravel-activitylog v5 par Hafiz sur dev.to.