summaryrefslogtreecommitdiff
path: root/app/Http/Middleware/Logger.php
blob: 17c2f187927608586b52df6fbeeb6c59494c4e5f (plain)
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;
    }
}