slogan3

Help me een aangepaste logging middleware in Laravel implementeren die gedetailleerde verzoekinformatie vastlegt

description

Door het implementeren van deze aangepaste logging middleware krijg je beter inzicht in inkomende verzoeken, verbeter je debuggingmogelijkheden en versterk je de naleving van logvereisten.

prompt

try_prompt

Ik wil een aangepaste logging middleware maken in mijn Laravel-toepassing die gedetailleerde informatie over inkomende verzoeken vastlegt, inclusief verzoekmethode, URL, headers en inhoud van de body. Leg uit hoe je deze middleware instelt, regist ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Hieronder volgt een stapsgewijze uitleg om een aangepaste logging middleware in Laravel te maken, deze te registreren, en de logging te configureren zoals je wenst: ### 1. Middleware maken Maak een nieuwe middleware aan met het Artisan-commando: ```bash php artisan make:middleware RequestLogger ``` ### 2. Middleware implementatie Open de net gemaakte `app/Http/Middleware/RequestLogger.php` en pas de handle-methode aan: ```php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\DB; class RequestLogger { public function handle(Request $request, Closure $next) { // Verzoekgegevens verzamelen $requestData = [ 'method' => $request->method(), 'url' => $request->fullUrl(), 'headers' => $this->getHeaders($request), 'body' => $request->all(), 'ip' => $request->ip(), 'timestamp' => now()->toIso8601String(), ]; // Log naar een specifieke locatie, bijvoorbeeld database DB::table('request_logs')->insert([ 'log' => json_encode($requestData), 'created_at' => now(), 'updated_at' => now(), ]); // Of log naar een bestand // Log::channel('custom')->info($requestData); return $next($request); } protected function getHeaders(Request $request) { return $request->headers->all(); } } ``` ### 3. Middleware registreren in `app/Http/Kernel.php` Voeg de middleware toe aan de `$middleware`-array of aan een middlewaregroep: ```php protected $middleware = [ // andere middleware... \App\Http\Middleware\RequestLogger::class, ]; ``` Of voor een specifieke groep (bijv. web of api): ```php protected $middlewareGroups = [ 'web' => [ // bestaande middleware... \App\Http\Middleware\RequestLogger::class, ], ]; ``` ### 4. Logging naar een specifiek opslagmedium - **Database:** Zoals in voorbeeld, insert in tabel `request_logs`. Zorg dat deze tabel bestaat: ```sql CREATE TABLE request_logs ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, log JSON, created_at TIMESTAMP, updated_at TIMESTAMP ); ``` - **Logbestand:** Configureer een custom logkanaal in `config/logging.php`: ```php 'channels' => [ // bestaande kanalen... 'custom' => [ 'driver' => 'single', 'path' => storage_path('logs/request_logs.log'), 'level' => 'info', 'formatter' => \Monolog\Formatter\JsonFormatter::class, ], ], ``` En gebruik in middleware: ```php Log::channel('custom')->info(json_encode($requestData)); ``` ### 5. Logformaat en retentiebeleid - **Formaat:** Gebruik `JsonFormatter` voor JSON formaat, zoals hierboven in de custom logkanaalconfiguratie. - **Retentiebeleid:** Stel retentie in via logrotate of door gebruik van Laravel's eigen logrotatie (bijv. via `daily` in `logging.php`): ```php 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'info', 'days' => 30, ], ``` Of voor een custom kanaal: ```php 'channels' => [ 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/request_logs.log'), 'level' => 'info', 'days' => 30, ], ], ``` ### Samenvatting - Maak middleware die verzoekgegevens verzamelt en logt (database of bestand). - Registreer middleware in `Kernel.php`. - Configureer logkanaal voor JSON formaat en retentie van 30 dagen. - Pas de opslag en retentie aan via Laravel's logging configuratie of externe tools. Mocht je verdere hulp nodig hebben, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Hier is een stapsgewijze handleiding voor het maken van een aangepaste logging middleware in Laravel: ### 1. Middleware Aanmaken Maak eerst de middleware aan met Artisan: ```bash php artisan make:middleware RequestLoggingMiddleware ``` ### 2. Middleware Implementatie Pas de `handle` methode aan in `app/Http/Middleware/RequestLoggingMiddleware.php`: ```php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; class RequestLoggingMiddleware { public function handle(Request $request, Closure $next) { // Log alleen bij bepaalde omgevingen indien nodig if (!app()->environment('local', 'staging')) { return $next($request); } $logData = [ 'request_id' => (string) Str::uuid(), 'timestamp' => now()->toISOString(), 'method' => $request->method(), 'url' => $request->fullUrl(), 'headers' => $request->headers->all(), 'body' => $request->except(['password', 'password_confirmation']), // Veiligheid: gevoelige data filteren 'ip' => $request->ip(), 'user_agent' => $request->userAgent() ]; // Log naar specifiek kanaal Log::channel('request')->info('Inkomend verzoek', $logData); return $next($request); } } ``` ### 3. Logging Configuration Configureer het logging kanaal in `config/logging.php`: ```php 'channels' => [ 'request' => [ 'driver' => 'daily', 'path' => storage_path('logs/request.log'), 'level' => 'info', 'days' => 30, // 30 dagen retentie 'formatter' => Monolog\Formatter\JsonFormatter::class, 'permission' => 0664, ], ], ``` ### 4. Middleware Registreren Registreer de middleware in `app/Http/Kernel.php`: ```php protected $middleware = [ // Andere middleware... \App\Http\Middleware\RequestLoggingMiddleware::class, ]; ``` ### 5. Database Logging (Optioneel) Voor database logging, maak eerst een migratie en model: Migratie: ```bash php artisan make:migration create_request_logs_table ``` ```php // In migratiebestand public function up() { Schema::create('request_logs', function (Blueprint $table) { $table->id(); $table->uuid('request_id'); $table->string('method', 10); $table->text('url'); $table->json('headers'); $table->json('body')->nullable(); $table->string('ip'); $table->text('user_agent'); $table->timestamp('created_at'); }); } ``` Model: ```php <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class RequestLog extends Model { protected $table = 'request_logs'; protected $guarded = []; public $timestamps = false; protected $casts = [ 'headers' => 'array', 'body' => 'array', ]; } ``` Pas de middleware aan voor database logging: ```php // In de handle methode RequestLog::create($logData); ``` ### 6. Retentie Beleid Voor database logs, voeg een scheduled task toe in `app/Console/Kernel.php`: ```php protected function schedule(Schedule $schedule) { $schedule->command('model:prune', [ '--model' => [RequestLog::class], ])->daily(); } ``` Voeg in het RequestLog model: ```php use Illuminate\Database\Eloquent\Prunable; class RequestLog extends Model { use Prunable; public function prunable() { return static::where('created_at', '<=', now()->subDays(30)); } } ``` ### Voorbeeld Log Output (JSON) ```json { "request_id": "550e8400-e29b-41d4-a716-446655440000", "timestamp": "2023-10-05T12:34:56.789Z", "method": "POST", "url": "https://voorbeeld.nl/api/users", "headers": { "user-agent": ["Mozilla/5.0..."], "accept": ["application/json"] }, "body": { "name": "Jan Jansen", "email": "jan@voorbeeld.nl" }, "ip": "192.168.1.1", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" } ``` ### Belangrijke Opmerkingen: - Filter altijd gevoelige data (wachtwoorden, tokens) - Gebruik de middleware alleen in ontwikkel-/testomgevingen voor prestaties - Monitor de logbestandsgrootte bij hoge traffic - Overweeg asynchrone verwerking voor productieomgevingen Deze implementatie zorgt voor gestructureerde JSON logging met automatische opschoning na 30 dagen.