1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Log;
use App\Models\VisitorLog;
class Logger
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$statusCode = $response->getStatusCode();
$logMessage = sprintf(
"[%s] IP: %s | Method: %s | Route: %s | Status: %s | Agent: %s",
now()->format('Y-m-d H:i:s'),
$request->ip(),
$request->method(),
$request->path(),
$statusCode,
$request->header('User-Agent')
);
try {
Log::channel('requests')->info($logMessage);
} catch (\Exception $e) {
// Log channel unavailable (e.g. permission error in test environment)
}
// Update visitor log in database
$statusColumn = match ($statusCode) {
200 => 'status_200_count',
404 => 'status_404_count',
405 => 'status_405_count',
500 => 'status_500_count',
default => null,
};
$visitor = VisitorLog::firstOrCreate(
['ip_address' => $request->ip()],
['first_seen_at' => now(), 'total_requests' => 0]
);
$visitor->increment('total_requests');
if ($statusColumn) {
$visitor->increment($statusColumn);
}
$visitor->update(['last_seen_at' => now()]);
return $response;
}
}
|