the-caretakers/laravel-request-logger
Installation
composer require the-caretakers/laravel-request-logger
php artisan vendor:publish --provider="TheCaretakers\RequestLogger\Providers\RequestLoggerServiceProvider" --tag="request-logger-config"
config/request-logger.php exists and matches your needs.Enable Middleware
Add the middleware to your HTTP kernel (app/Http/Kernel.php) in the $middleware or $middlewareGroups array:
\TheCaretakers\RequestLogger\Http\Middleware\RequestLogger::class,
First Use Case
logs/requests) for later inspection./admin/*) by default.config/request-logger.php – Adjust disk, log_profile, and log_writer as needed.\TheCaretakers\RequestLogger\Http\Middleware\RequestLogger – Inspect how requests/responses are captured.LogWriter class.Logging All Requests
{
"timestamp": "2023-10-01T12:00:00Z",
"method": "GET",
"path": "/api/users",
"ip": "192.168.1.1",
"user_agent": "Postman/10.0",
"status_code": 200,
"duration_ms": 120,
"input": { "sanitized": true },
"response": { "sanitized": true }
}
Conditional Logging
log_profile to filter requests (e.g., log only /api/* or requests with X-Log-Request: true header).// app/Profiles/LogAdminRequests.php
namespace App\Profiles;
use TheCaretakers\RequestLogger\Contracts\LogProfile;
class LogAdminRequests implements LogProfile {
public function shouldLog(\Illuminate\Http\Request $request) {
return str_starts_with($request->path(), '/admin');
}
}
'log_profile' => \App\Profiles\LogAdminRequests::class,
Custom Log Writers
\TheCaretakers\RequestLogger\Contracts\LogWriter to modify log format or storage.// app/Writers/DatabaseLogWriter.php
namespace App\Writers;
use TheCaretakers\RequestLogger\Contracts\LogWriter;
class DatabaseLogWriter implements LogWriter {
public function write(array $logEntry) {
\App\Models\RequestLog::create($logEntry);
}
}
'log_writer' => \App\Writers\DatabaseLogWriter::class,
Log Rotation
rotate:request-logs command to clean up old logs:
php artisan request-logger:rotate --days=30
app/Console/Kernel.php:
$schedule->command('request-logger:rotate --days=30')->daily();
config('request-logger.sanitize') if needed.log_profile.$this->app->instance(
\TheCaretakers\RequestLogger\Contracts\LogWriter::class,
new class implements \TheCaretakers\RequestLogger\Contracts\LogWriter {
public function write(array $logEntry) {
// Assert or store for testing
}
}
);
Disk Permissions
logs/requests) is writable by Laravel.storage/logs/requests permissions or S3 bucket policies if using cloud storage.Log Bloat
log_profile to limit scope.du -sh storage/logs/requests
Middleware Order
RequestLogger after StartSession and Authenticate to capture user context (e.g., $request->user()).TrimStrings or ConvertEmptyStringsToNull to log raw input.Sanitization Overrides
log_writer may bypass sanitization. Reapply it if needed:
public function write(array $logEntry) {
$logEntry['input'] = $this->sanitize($logEntry['input']);
// ...
}
Missing Logs
Kernel.php.config('request-logger.enabled') (defaults to true).\TheCaretakers\RequestLogger\Facades\RequestLogger::log($request, $response);
Log Format Issues
storage/logs/requests/2023-10-01.json) to debug serialization errors.LogWriter to add error handling:
try {
file_put_contents($path, json_encode($logEntry));
} catch (\Throwable $e) {
\Log::error("Failed to write request log", ['error' => $e->getMessage()]);
}
Rotation Failures
rotate:request-logs command has access to log files.--dry-run:
php artisan request-logger:rotate --days=1 --dry-run
Custom Log Fields
LogWriter:
$logEntry['custom_field'] = $this->getCustomData($request);
Real-Time Monitoring
tail -f on log files:
tail -f storage/logs/requests/*.json
Log Export
// app/Console/Commands/ExportRequestLogs.php
use Illuminate\Console\Command;
use TheCaretakers\RequestLogger\Facades\RequestLogger;
class ExportRequestLogs extends Command {
protected $signature = 'request-logger:export {--path=}';
public function handle() {
$logs = RequestLogger::getAllLogs();
file_put_contents($this->option('path'), json_encode($logs));
}
}
Conditional Logging in Code
if ($request->is('critical-endpoint')) {
\TheCaretakers\RequestLogger\Facades\RequestLogger::log($request, $response);
}
How can I help you explore Laravel packages today?