bilfeldt/laravel-request-logger
Log incoming HTTP requests in Laravel with a simple middleware. Capture method, URL, headers, payload, response status and timing, then store to database or logs for debugging, auditing and performance insights. Configurable, lightweight, easy to add to routes or globally.
Installation:
composer require bilfeldt/laravel-request-logger
php artisan vendor:publish --provider="Bilfeldt\RequestLogger\RequestLoggerServiceProvider" --tag="request-logger-migrations"
php artisan migrate
First Use Case: Enable logging for a route via middleware:
Route::middleware('requestlog')->get('/api/endpoint', [YourController::class, 'method']);
This logs the request/response to the database with minimal configuration.
php artisan vendor:publish --provider="Bilfeldt\RequestLogger\RequestLoggerServiceProvider" --tag="request-logger-config"
log_methods or log_statuses in config/request-logger.php to filter logs (e.g., ['*'] for all requests or ['5**'] for server errors).Route-Level Control:
Route::middleware(['requestlog'])->group(function () {
Route::get('/admin', [AdminController::class, 'index']);
Route::post('/api/webhook', [WebhookController::class, 'handle']);
});
Conditional Logging:
Route::middleware(['requestlog:custom-driver'])->get('/debug', [DebugController::class, 'log']);
public function sensitiveAction(Request $request) {
$request->enableLog(); // Logs this specific request
// ...
}
Error Handling:
Combine with Laravel’s App\Exceptions\Handler to log failed requests automatically:
public function register() {
$this->renderable(function (Throwable $e, $request) {
$request->enableLog(); // Log failed requests
return response()->view('errors.500');
});
}
Testing:
Mock the RequestLog model in tests:
$this->partialMock(RequestLog::class, function ($mock) {
$mock->shouldReceive('create')->once();
});
// app/Providers/RequestLoggerServiceProvider.php
public function register() {
$this->app->extend('request-logger', function () {
return new ElasticsearchLogger();
});
}
Route::middleware(['log:elasticsearch'])->get('/search', [SearchController::class, 'index']);
Performance Overhead:
'log_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], // Exclude OPTIONS, etc.
Database Bloat:
// app/Console/Kernel.php
protected function schedule(Schedule $schedule) {
$schedule->command('requestlog:prune')->dailyAt('2:00');
}
REQUEST_LOGGER_DB_CONNECTION=logging
Sensitive Data Leakage:
api_token):
'headers' => ['authorization', 'cookie'],
'parameters' => ['password', 'credit_card'],
Proxy/Load Balancer IPs:
config/trustedproxies.php to log client IPs correctly:
'proxies' => ['192.168.1.1', '10.0.0.1'],
Verify Logging:
Check the request_logs table for entries after triggering a logged request. Use Laravel Scout for real-time monitoring:
php artisan tinker
>>> \Bilfeldt\RequestLogger\RequestLog::latest()->first();
Middleware Debugging: Add a temporary log to diagnose middleware issues:
Route::middleware(['requestlog', function ($request, $next) {
\Log::info('Middleware executed', ['path' => $request->path()]);
return $next($request);
}])->get('/test', [TestController::class, 'index']);
Custom Driver Issues:
Bilfeldt\RequestLogger\Contracts\Logger:
class ElasticsearchLogger implements Logger {
public function log(Request $request, Response $response) {
// Implementation
}
}
Modify Logged Data:
Override the RequestLog model to customize fields:
// app/Models/CustomRequestLog.php
class CustomRequestLog extends \Bilfeldt\RequestLogger\RequestLog {
protected $casts = [
'user_agent' => 'encrypted', // Encrypt sensitive UAs
];
}
Update config:
'model' => \App\Models\CustomRequestLog::class,
Add Metadata:
Use the LogContextMiddleware (from bilfeldt/laravel-correlation-id) to attach context:
Route::middleware(['requestlog', 'log-context'])->get('/tracked', [TrackedController::class, 'index']);
Filtering: Dynamically exclude routes in middleware:
public function handle($request, Closure $next) {
if ($request->is('health*')) return $next($request);
return parent::handle($request, $next);
}
How can I help you explore Laravel packages today?