PHP code example of salvatorecervone / logoperations

1. Go to this page and download the library: Download salvatorecervone/logoperations library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

salvatorecervone / logoperations example snippets


return [
    // --------------------------------------------------------------------------
    // Abilitazione Globale & Modalità di Tracciamento
    // --------------------------------------------------------------------------
    'enabled' => env('LOG_OPERATIONS_ENABLED', true),

    // 'selective' (default consigliato): traccia solo rotte attivate in Studio o con alias
    // 'all': traccia a tappeto tutte le rotte ammesse
    'mode' => env('LOG_OPERATIONS_MODE', 'selective'),

    // Paracadute Errori 500: in modalità 'selective', cattura comunque crash ed eccezioni 500 anche su rotte non monitorate
    'log_uncaught_errors' => env('LOG_OPERATIONS_LOG_UNCAUGHT_ERRORS', true),

    // --------------------------------------------------------------------------
    // Nomi Tabelle Database & Connessione
    // --------------------------------------------------------------------------
    // Tabella principale per i log operativi, errori e Storyboard polimorfica
    'table_name' => env('LOG_OPERATIONS_TABLE', 'log_operazioni'),

    // Tabella per i soggetti multipli collegati (Auto-Discovery Eloquent)
    'subjects_table_name' => env('LOG_OPERATIONS_SUBJECTS_TABLE_NAME', 'log_operazioni_soggetti'),

    // Auto-Discovery globale degli eventi Eloquent durante le richieste monitorate
    'auto_discover_subjects' => env('LOG_OPERATIONS_AUTO_DISCOVER_SUBJECTS', true),

    // Namespace dei modelli di dominio da monitorare (esclude pivot e framework)
    'models_namespace' => env('LOG_OPERATIONS_MODELS_NAMESPACE', 'App\\Models'),

    // Tabella per la memorizzazione delle regole del Tracking Studio (rotte, proxy metodi, sessioni)
    'rules_table_name' => env('LOG_OPERATIONS_RULES_TABLE', 'log_operazioni_regole'),

    // Connessione DB dedicata (null = connessione predefinita di Laravel; es. 'mysql_logs' o 'sqlite_logs')
    'database_connection' => env('LOG_OPERATIONS_DB_CONNECTION', null),

    // Caricamento automatico migrazioni (false = gestisci le migrazioni solo manualmente sul DB dedicato)
    'load_migrations' => env('LOG_OPERATIONS_LOAD_MIGRATIONS', true),

    // --------------------------------------------------------------------------
    // Filtri Richieste & Campionamento (Sampling)
    // --------------------------------------------------------------------------
    // Verbi HTTP monitorati: ['*'] per tutti i verbi sulle rotte selezionate
    // oppure lista specifica come ['POST', 'PUT', 'PATCH', 'DELETE']
    'allowed_methods' => ['*'],

    // Codici di stato esclusi dal logging (es. errori di validazione form)
    'excluded_status_codes' => [422],

    // Rotte escluse (per evitare loop di auto-logging)
    'excluded_routes' => ['api/logoperations*', 'api/log-operations*', 'telescope*'],

    // Percentuale di campionamento chiamate riuscite 2xx (0-100%). Gli errori >= 400 sono sempre loggati al 100%
    'sampling_rate' => env('LOG_OPERATIONS_SAMPLING_RATE', 100),

    // --------------------------------------------------------------------------
    // Elaborazione Asincrona su Coda (Queue Worker)
    // --------------------------------------------------------------------------
    'queue' => [
        'enabled' => env('LOG_OPERATIONS_QUEUE_ENABLED', false),
        'connection' => env('LOG_OPERATIONS_QUEUE_CONNECTION', null),
        'queue' => env('LOG_OPERATIONS_QUEUE_NAME', 'default'), // 'default' o coda dedicata es. 'log-operations'
        'tries' => 3,
        'backoff' => [5, 10, 30],
        'failed_jobs_threshold' => 5,
        'alert_email' => env('LOG_OPERATIONS_QUEUE_ALERT_EMAIL', null),
    ],

    // --------------------------------------------------------------------------
    // API REST & Sicurezza Accesso
    // --------------------------------------------------------------------------
    'api_prefix' => env('LOG_OPERATIONS_API_PREFIX', 'api/logoperations'),
    'api_middleware' => ['api'],
    'gate' => 'viewLogOperations',
    'allow_in_local' => true,

    // --------------------------------------------------------------------------
    // Stack Trace Intelligente a Due Livelli
    // --------------------------------------------------------------------------
    'stack_trace' => [
        'enabled' => env('LOG_OPERATIONS_STACK_ENABLED', true),
        'only_on_error' => env('LOG_OPERATIONS_STACK_ONLY_ON_ERROR', true), // Salva stack trace solo su errori (>= 400)
        'default_view' => 'core',         // 'core' (solo app/) o 'full' (intero albero vendor)
        'project_paths' => ['app/'],      // Percorsi considerati codice applicativo proprietario
        'exclude_paths' => ['vendor/'],
        'max_frames' => 100,
        'trace_db_callers' => true,
        'max_db_callers' => (int) env('LOG_OPERATIONS_MAX_DB_CALLERS', 50),
    ],

    // --------------------------------------------------------------------------
    // Gestione & Ripristino Automatico Transazioni DB
    // --------------------------------------------------------------------------
    'transactions' => [
        'manage_unfinished' => true,
        'rollback_on_error' => true,      // Esegue rollback di sicurezza su HTTP >= 400
        'commit_on_success' => false,     // false = sicurezza preventiva anche su esito 200
        'log_transaction_state' => true,
    ],

    // --------------------------------------------------------------------------
    // Privacy, GDPR & Mascheramento Dati Sensibili
    // --------------------------------------------------------------------------
    'mask_fields' => ['password', 'password_confirmation', 'token', 'secret', 'authorization', 'credit_card'],
    'privacy' => [
        'anonymize_ip' => env('LOG_OPERATIONS_ANONYMIZE_IP', false),
        'anonymize_ip_mask' => 'xxx',     // Mascheratura ultimo ottetto IPv4 ('xxx' o '0')
        'log_headers' => false,
        'mask_headers' => ['authorization', 'php-auth-pw', 'cookie', 'x-csrf-token', 'x-xsrf-token'],
    ],

    // Colonne da interrogare per la ricerca utenti nel Tracking Studio
    'user_search_fields' => ['name', 'cognome', 'email'],

    // --------------------------------------------------------------------------
    // Dashboard Web Standalone
    // --------------------------------------------------------------------------
    'dashboard' => [
        'enabled' => env('LOG_OPERATIONS_DASHBOARD_ENABLED', true),
        'route' => 'logoperations',
        'middleware' => ['web'],
        'per_page' => 20,
        'per_page_options' => [15, 20, 25, 50, 100],
    ],

    // --------------------------------------------------------------------------
    // Sistema di Allarmi & Notifiche Multi-Canale
    // --------------------------------------------------------------------------
    'alerts' => [
        'enabled' => env('LOG_OPERATIONS_ALERTS_ENABLED', false),
        'channels' => ['mail', 'slack', 'discord', 'webhook'],
        'mail' => ['to' => env('LOG_OPERATIONS_ALERT_EMAIL', null)],
        'slack' => ['webhook_url' => env('LOG_OPERATIONS_SLACK_WEBHOOK', null)],
        'discord' => ['webhook_url' => env('LOG_OPERATIONS_DISCORD_WEBHOOK', null)],
        'webhook' => [
            'url' => env('LOG_OPERATIONS_ALERT_WEBHOOK', null),
            'secret' => env('LOG_OPERATIONS_ALERT_WEBHOOK_SECRET', null),
        ],
        'throttle_minutes' => 15,
        'notify_on_rollback' => true,
        'error_rate' => [
            'window_minutes' => 5,
            'threshold_percentage' => 10.0,
            'min_requests' => 20,
        ],
    ],

    // --------------------------------------------------------------------------
    // Retention Policy & Salvaguardia Audit Trail
    // --------------------------------------------------------------------------
    'retention' => [
        'enabled' => env('LOG_OPERATIONS_RETENTION_ENABLED', false),
        'days' => env('LOG_OPERATIONS_RETENTION_DAYS', 90),
        'preserve_storyboards' => true,   // Protegge al 100% tutti i record con subject_id
        'preserve_errors' => true,        // Preserva tutti i log con codice HTTP >= 400
        'preserve_mutations' => false,    // true = preserva anche POST/PUT/DELETE
        'chunk_size' => 1000,
    ],

    // Nome identificativo dell'applicazione (per ambienti multi-app o microservizi)
    'app_name' => env('LOG_OPERATIONS_APP_NAME', env('APP_NAME', 'laravel')),
];

// config/database.php
'connections' => [
    // ... connessione predefinita dell'app (es. mysql) ...

    'logs_db' => [
        'driver'    => 'mysql', // oppure pgsql, sqlite, ecc.
        'host'      => env('DB_LOGS_HOST', '127.0.0.1'),
        'port'      => env('DB_LOGS_PORT', '3306'),
        'database'  => env('DB_LOGS_DATABASE', 'app_logs'),
        'username'  => env('DB_LOGS_USERNAME', 'root'),
        'password'  => env('DB_LOGS_PASSWORD', ''),
        'charset'   => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix'    => '',
    ],
],

public function getConnection(): ?string
{
    return config('logoperations.database_connection');
}

use SalvatoreCervone\LogOperations\Http\Middleware\LogOperationsMiddleware;

// 🚫 Rotte tipologiche / lookup / statiche: NESSUN LOG
Route::prefix('tipologiche')->group(function () {
    Route::get('stati-ordine', [LookupController::class, 'orderStatuses']);
    Route::get('comuni', [LookupController::class, 'cities']);
});

// ✅ Rotte operative di business: MONITORATE per la Storyboard
// Supporta sia l'alias 'log.operations' sia la classe LogOperationsMiddleware::class:
Route::middleware(LogOperationsMiddleware::class)->group(function () {
    Route::apiResource('ordini', OrderController::class);
    Route::apiResource('fatture', InvoiceController::class);
    Route::post('pagamenti/checkout', [PaymentController::class, 'checkout']);
});

use SalvatoreCervone\LogOperations\Http\Middleware\LogOperationsMiddleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        // Registrazione globale (per Modalità 1 o Modalità 3)
        $middleware->append(LogOperationsMiddleware::class);
    })
    // ...

protected $middleware = [
    // ...
    \SalvatoreCervone\LogOperations\Http\Middleware\LogOperationsMiddleware::class,
];

use SalvatoreCervone\LogOperations\Facades\LogOperations;

class OrderController extends Controller
{
    public function store(Request $request)
    {
        // Checkpoint manuale
        LogOperations::step('Inizio validazione ordine');

        // Traccia l'esecuzione di un blocco con misurazione automatica della durata
        $totale = LogOperations::trace('Calcolo totale carrello', function () {
            return $this->calcolaTotale();
        });

        LogOperations::step('Ordine completato con successo');

        return response()->json(['success' => true, 'totale' => $totale]);
    }
}

// Esempio con autenticazione Sanctum o sessione Web
'api_middleware' => ['web', 'auth'],
// oppure:
'api_middleware' => ['api', 'auth:sanctum'],

use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::define('viewLogOperations', function ($user = null) {
        // Consenti l'accesso solo agli amministratori
        return $user && in_array($user->email, [
            '[email protected]',
            '[email protected]',
        ]);
    });
}

  'dashboard' => [
      'enabled' => env('LOG_OPERATIONS_DASHBOARD_ENABLED', true),
      'route' => env('LOG_OPERATIONS_DASHBOARD_ROUTE', 'logoperations'),
      'middleware' => ['web'],
      'per_page' => 20,
      'per_page_options' => [15, 20, 25, 50, 100],
  ],
  

use Illuminate\Database\Eloquent\Model;
use SalvatoreCervone\LogOperations\Traits\HasOperationLogs;

class Order extends Model
{
    use HasOperationLogs;
}

Route::put('/ordini/{order}', [OrderController::class, 'update'])->middleware('log.operations');

// Registra un checkpoint di business collegato all'ordine:
$order->logStep('Autorizzazione pagamento ricevuta da Stripe', ['payment_id' => 'ch_123']);

// Recupera l'intera storia cronologica del record:
$timeline = $order->storyboard();

// In un controller o service monitorato:
$order = Order::create([...]);
$invoice = Invoice::create(['order_id' => $order->id, ...]);
$customer->update(['ultimo_acquisto' => now()]);

  $order->storyboard();    // Mostra l'evento di checkout
  $invoice->storyboard();  // Mostra lo stesso evento di checkout!
  $customer->storyboard(); // Mostra lo stesso evento di checkout!
  

use Illuminate\Database\Eloquent\Model;
use SalvatoreCervone\LogOperations\Traits\HasOperationLogs;

class AnagraficaUfficio extends Model
{
    use HasOperationLogs;

    // Specifica le relazioni 'belongsTo' genitore da collegare alla Storyboard:
    protected array $logParents = ['anagrafica', 'ufficio'];

    public function anagrafica()
    {
        return $this->belongsTo(Anagrafica::class);
    }

    public function ufficio()
    {
        return $this->belongsTo(Ufficio::class);
    }
}

> 'parent_relations' => [
>     App\Models\AnagraficaUfficio::class => ['anagrafica', 'ufficio'],
>     App\Models\OrderItem::class => ['order'],
> ],
> 

use SalvatoreCervone\LogOperations\Attributes\Traceable;

// Traccia tutti i metodi pubblici della classe:
#[Traceable]
class PaymentGatewayService
{
    public function charge(Order $order): bool { ... }
}

// Oppure traccia solo singoli metodi:
class OrderService
{
    #[Traceable(label: 'Calcolo Giudiziario e Totali', level: 'core')]
    public function calcolaTotale(Order $order): float
    {
        return 99.50;
    }
}

   // config/logoperations.php
   'queue' => [
       'enabled' => env('LOG_OPERATIONS_QUEUE_ENABLED', false),
       'connection' => env('LOG_OPERATIONS_QUEUE_CONNECTION', null),
       'queue' => env('LOG_OPERATIONS_QUEUE_NAME', 'default'), // Coda 'default' o dedicata (es. 'log-operations')
       'tries' => 3,
       'backoff' => [10, 30, 60],
       'alert_email' => env('LOG_OPERATIONS_ALERT_EMAIL', null),
       'failed_jobs_threshold' => 5,
   ],
   

   // Registra solo il 10% delle chiamate con esito 200 OK
   'sampling_rate' => 10,
   

   use SalvatoreCervone\LogOperations\Facades\LogOperations;

   // 1. Cancellazione fisica di tutti i log dell'utente:
   LogOperations::forgetUser($userId);

   // 2. Soft Scrub (preserva durata, rotte e codici HTTP, ma azzera dati personali e IP):
   LogOperations::forgetUser($userId, anonymize: true);
   

'alerts' => [
    'enabled' => env('LOG_OPERATIONS_ALERTS_ENABLED', false),

    // Array dei canali abilitati all'invio:
    'channels' => ['mail', 'slack'], // oppure ['slack', 'discord', 'webhook']

    // ...
],

use Illuminate\Support\Facades\Schedule;

Schedule::command('logoperations:check-alerts --window=5 --threshold=10')
    ->everyFiveMinutes();

Schedule::command('logoperations:clear-expired-rules')->daily();
bash
# Configurazione
php artisan vendor:publish --tag=logoperations-config

# Migrazioni DB
php artisan vendor:publish --tag=logoperations-migrations

# Viste Blade della Dashboard autonoma (opzionale)
php artisan vendor:publish --tag=logoperations-views

# Componenti Vue 3 per SPA (opzionale)
php artisan vendor:publish --tag=logoperations-vue
bash
php artisan migrate
sql
> GRANT ALL PRIVILEGES ON app_logs.* TO 'utente_db'@'%';
> FLUSH PRIVILEGES;
> 
bash
   php artisan migrate --path=vendor/salvatorecervone/laravel-logoperations/database/migrations --database=logs_db
   
bash
   >   php artisan queue:work --queue=log-operations,default
   >   
bash
php artisan logoperations:check-alerts --window=5 --threshold=10 --min-requests=20
bash
# Rimuove le sole sessioni/regole scadute:
php artisan logoperations:clear-expired-rules

# Simulazione (dry-run):
php artisan logoperations:clear-expired-rules --dry-run
bash
php artisan logoperations:status
bash
cd demo
php artisan serve