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
...
tags
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.

