Cosa fa questo modulo
Sistema di audit log applicativo basato su spatie/laravel-activitylog (de facto standard ecosistema Laravel) per tracciare in modo strutturato chi ha fatto cosa, quando e su quale entità, con persistenza su tabella dedicata activity_log (causer_id/causer_type polimorfico, subject_id/subject_type polimorfico, log_name per canale, description, event create/updated/deleted/restored, properties JSON con attributes/old, batch_uuid per raggruppare operazioni correlate, created_at). Setup: pubblicazione config e migration spatie, abilitazione trait LogsActivity sui modelli sensibili (User, Order, Booking, Invoice, Payment, Patient, Reservation, Contract, Document, Subscription) con LogOptions per dichiarare campi tracciati (logFillable / logOnly([...]) / logExceptAttributes([password, remember_token, api_token, secret]) / logOnlyDirty / dontSubmitEmptyLogs / submitEmptyLogs false / useLogName per canale dedicato per modello), eventi automatici Eloquent (created/updated/deleted/restored) con diff old↔new salvato in properties. Logging manuale via helper activity()->causedBy($user)->performedOn($subject)->withProperties([...])->log('descrizione') per eventi business non Eloquent (login, logout, login_failed, password_reset, 2FA_enable, export_csv, download_documento, impersonate_start/stop, role_change, permission_grant/revoke, settings_update, api_token_issued/revoked, file_upload, payment_intent_created, webhook_received, manual_correction). Causer automatico: macro che risolve auth()->user() (web + sanctum + passport), in coda usa il currentTeam o system user, supporto impersonation (registra impersonator originale in properties impersonated_by per non perdere accountability). Subject polimorfico: utile per registrare azioni su qualunque modello senza foreign key esplicite; query rapide via $model->activities() (trait HasActivities sui subject) e $user->actions (trait CausesActivity sul causer). Properties JSON: oltre a old/attributes, contesto request (ip, user_agent, route, method, http_status), session_id, sorgente (web/api/cli/queue/system), trace_id per correlare con Sentry/Telescope, deviceType, geo-IP (city/country opzionale via lookup batch). Backoffice UI (Filament/Nova/Blade): pagina /admin/audit-log con datatable server-side filtrabile per data range, utente causer (search async), modello subject, log_name (canale), event type, ip, parola chiave in description; vista dettaglio activity con diff colorato old vs new (verde/rosso) campo per campo, link al subject (model edit page), link al causer (user profile), timeline laterale ultimi N eventi sullo stesso subject, export CSV/XLSX/JSON delle attività filtrate, permalink shareable. Multi-canale (log_name): canali separati per macro-area (security, business, system, integrations) configurabili in config/activitylog.php default_log_name e LogOptions::useLogName('security') sul modello, con filtri UI per canale; canali con retention diversa (security 5 anni per compliance, business 2 anni, system/integrations 90 giorni) gestiti da job artisan activitylog:clean con --days e --log-name dedicato in scheduler. Storage e performance: indici DB su (causer_type, causer_id), (subject_type, subject_id), (log_name, created_at), (event, created_at) per query rapide su milioni di righe; partitioning mensile su MySQL 8/PostgreSQL per dataset grandi; archive su S3/Glacier per righe >12 mesi con view union archive+hot; opzione persistenza alternativa su MongoDB/ClickHouse via custom ActivityLogger driver per progetti con volumi >100M righe. Sicurezza e tamper-evidence: tabella activity_log read-only via DB grant (l'app inserisce, nessuno aggiorna o elimina manualmente), opzionale hash chain (ogni riga include sha256 della precedente per detection alterazioni post-hoc), signing log critici con HMAC per export legali, backup giornaliero append-only su bucket immutable (S3 object lock). Privacy/GDPR: masking automatico PII configurabile (CF, IBAN, email, telefono → hash o ofuscazione parziale) in withProperties, esclusione field sensibili da logFillable, diritto cancellazione (anonymize causer su richiesta GDPR: $user->causedActivities()->update(['causer_id' => null, 'properties->anonymized_at' => now()]) mantenendo l'attività ma rimuovendo l'identificazione personale), registro trattamenti DPA documenta finalità (sicurezza, prevenzione frodi, compliance contrattuale), DPIA per audit log esteso, retention policy dichiarata per canale. Casi d'uso: gestionali multi-utente (chi ha modificato il prezzo del listino, chi ha cancellato la prenotazione, chi ha cambiato il ruolo a Mario), e-commerce (chi ha rimborsato l'ordine #1234, chi ha modificato il prodotto), sanità/legale (compliance accessi dossier cliente/paziente con consultazione registro, evidenza legale), HR/payroll (chi ha modificato lo stipendio), finanza (chi ha approvato fattura X), supporto/helpdesk (chi ha chiuso ticket, chi ha impersonato cliente per debug), platform agentic Footility (registra azioni eseguite dal sistema agentic con causer = system user dedicato, distinguibile dai causer umani). Integrazioni: Sentry/Datadog/Honeycomb (event sink opzionale via observer per alerting su pattern sospetti come 100 delete in 1 minuto da stesso user, login failed >5 in 1 min, role grant fuori orario), Slack/Teams notifier su eventi critici (admin role grant, mass export, mass delete) via channel webhook, SIEM enterprise (Splunk/ELK) via filebeat su log applicativo parallelo, antifraud rule engine (custom). Differenza da #8338 Telescope/debugbar (debug developer-side, ephemeral) e da Laravel log file standard (testuali, non queryable): qui è log strutturato, persistente, query-friendly, business-readable in UI admin, con causer/subject espliciti e compliance-grade. Differenza da spatie/laravel-permission audit (registro solo permission grant/revoke): qui copre TUTTE le entità tramite trait. Costo: 1-2 giorni setup base + 0.5 giorno per modello aggiuntivo da tracciare + 1-2 giorni UI filtri/diff/export, dipende da numero modelli e granularità richiesta.
Esempi d'uso