เก็บ Log ทุกๆ requests ผ่าน Middleware - ตอนที่ 1

เริ่มต้นวิธีการเขียน Log http requests ผ่านตัว Middleware

จากบทความก่อนหน้า

เอาจริงๆแล้วมันเป็นวิธีที่ง่าย และ simple ที่สุดแล้วครับ เพราะเราสามารถจัดการได้ที่เดียวเลย และแก้ไขได้ง่าย

มาดูขั้นตอนการสร้างกันครับ

1. Middleware

คือระบบที่เราสามารถใช้เพื่อจัดการ request และ response ใน Laravel ซึ่งเราสามารถใช้เพื่อเก็บ log ได้

สร้าง middleware ใหม่ด้วยคำสั่ง:

php artisan make:middleware LogRequestMiddleware

เราก็จะได้ไฟล์ app/Http/Middleware/LogRequestMiddleware.php มีหน้าตาอย่างงี้

app/Http/Middleware/LogRequestMiddleware.php
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;

class LogRequestMiddleware
{
    /**
     * Handle incoming request
     */
    public function handle(Request $request, \Closure $next)
    {
        //

        return $next($request);
    }
}

แล้วเอา Middleware ตัวนี้ไปลงทะเบียนลำดับการทำงานที่ app/Http/Kernel.php

เช่นตัวอย่างนี้

มาอธิบาย middleware กันหน่อย

ดูจากตัวแปลที่รับเข้ามาใน method handler มันจะมีแค่ $request และ $next

ซึ่งคำสั่ง $next นั้น เอาไว้กระทำกับ middleware ตัวถัดไป จนกว่าจะเสร็จทุกขั้นตอน

(ดูได้ที่ app/Http/Kernel.php)

เรามาปรับรูปแบบใหม่เพื่อเตรียมทำ log เราก็จะได้หน้าตาแบบนี้

ถ้าเราเขียน log จากตรงนี้มันก็ทำได้แหละครับ, แต่มันจะมีปัญหาตามมาคือ "บางที method handle ตรงนี้อาจจะมาไม่ถึงหากมี request พังก่อนหน้า"

ดังนั้นเรามาดูตรงนี้กันครับ

เพิ่ม method terminate เข้ามา ซึ่ง method นี้จะทำงานก็ต่อเมื่อ request นั้นสิ้นสุดลง

พอเพิ่มแล้วเราก็จะได้หน้าตาแบบนี้ครับ

มันก็จะดักได้ง่ายขึ้น เพราะเราไม่ต้องกังวลตัว middleware ที่อยู่ก่อนหน้าตัวนี้

ทีนี้ เรามาออกแบบตัวเขียน log กันครับ

2. ออกแบบตัวเขียน Log

ประเด็นเลยคือ พอเราจะเขียน log แต่ละทีหนิ, เราชอบนึกเรื่องที่มันดูซับซ้อนก่อนเลยคือ "เขียนลง DB ไหนดีหล่ะ ถึงจะเร็ว"

ผมจะบอกว่า "เลิกคิดเถอะครับ" เพราะสุดท้าย คุณต้องหาสิ่งที่ดีกว่าที่สุดอยู่เรื่อยๆ

ดังนั้น, ใช้ Strategy Pattern ละกัน

โจทย์คือ

  • ต้องเก็บทุก request, method, url, header, user agent, ip address, payload

  • เก็บทุก response, status code, response header, response body

เริ่ม

สร้างไฟล์ app/Contracts/HttpLogger.php

แล้วทำไปใช้งานที่ middleware ได้เลย ก็จะได้หน้าตาแบบนี้

"อย่าเพิ่งไป Run นะ, พังนะ"

3. เขียน Log ลง Database

"คิดอะไรไม่ออก ก็เขียน log ลง db ตัวเองแบบง่ายๆนี่แหละ"

สร้างไฟล์ app/Features/HttpLogger/DatabaseLogger.php

พอเราได้ทุกอย่างที่ต้องการแล้ว, เราก็เอาไปลงทะเบียนที่ Provider กันครับ

ในที่นี่ ผมเอาไว้ที่ app/Providers/AppServiceProvider.php

เป็นอันจบครับ สำหรับการเขียน log ผ่าน middleware

Last updated