ป้ายกำกับ: HTTP Error

การแสดงและเก็บ log http error messageการแสดงและเก็บ log http error message

การจัดการข้อผิดพลาด (Error Handling) ที่มีประสิทธิภาพถือเป็นหัวใจสำคัญของระบบที่เชื่อถือได้ ไม่ว่าจะเป็นการแสดงผลต่อผู้ใช้งาน (User Experience) หรือการสืบค้นหาต้นตอของปัญหาโดยทีมพัฒนา (Debugging) การบันทึก Log ที่สมบูรณ์จึงเป็นสิ่งที่ขาดไม่ได้

ในฐานะ System Specialist ที่ทำงานกับระบบฐานข้อมูล PostgreSQL การทำความเข้าใจว่า HTTP Status Code ใดที่เกิดจากข้อผิดพลาดทางตรรกะ (Logic Error) และข้อผิดพลาดทางโครงสร้าง (Constraint Violation) ของฐานข้อมูลนั้นมีความสำคัญอย่างยิ่ง บทความนี้จะเจาะลึกวิธีการออกแบบการบันทึก Log ข้อผิดพลาดที่เชื่อมโยงระหว่าง HTTP Error Message กับข้อมูลเชิงลึกของ PostgreSQL เพื่อให้การ Debugging เป็นไปอย่างรวดเร็วและแม่นยำ

หลักการแยกแยะ Error Logging: User vs. System

เมื่อระบบเกิดข้อผิดพลาด ข้อมูลที่ต้องถูกบันทึกใน Log ควรถูกแบ่งออกเป็นสองส่วนหลัก:

  1. User-Facing Message: ข้อความที่แสดงให้ผู้ใช้เห็น ต้องเป็นภาษาที่เข้าใจง่าย เช่น “รหัสสินค้าไม่ถูกต้อง” (แทนที่จะแสดง “Invalid input for product_id”).
  2. System Log Data: ข้อมูลที่เก็บไว้ใน PostgreSQL หรือระบบ Monitoring ต้องมีบริบทครบถ้วน เช่น SQLSTATE, Transaction ID, Stack Trace, และข้อมูล Input ที่ทำให้เกิดข้อผิดพลาด

การจับ Error ใน PostgreSQL เพื่อการ Log ที่สมบูรณ์

ใน PostgreSQL เราสามารถใช้บล็อก EXCEPTION เพื่อดักจับข้อผิดพลาดที่เกิดขึ้นระหว่างการทำงานของ Transaction ได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น การพยายามแทรกข้อมูลที่ละเมิดข้อจำกัด (Constraint Violation) ของตาราง:

SQL

-- ตัวอย่างการสร้าง Function ที่ดักจับข้อผิดพลาดและ Log ข้อมูลที่ผิดพลาด
CREATE OR REPLACE FUNCTION process_user_data(p_user_id INT, p_email TEXT) RETURNS TEXT AS $$
DECLARE
    v_error_message TEXT;
BEGIN
    -- ลองทำการ Insert ข้อมูล
    INSERT INTO users (user_id, email) VALUES (p_user_id, p_email);
    RETURN 'Success';
EXCEPTION
    -- ดักจับข้อผิดพลาดเฉพาะกรณี Unique Constraint Violation
    WHEN unique_violation THEN
        GET STACKED DIAGNOSTICS v_error_message = MESSAGE_TEXT;
        -- 1. บันทึก Log เข้าตาราง Log_Errors
        INSERT INTO log_errors (error_type, error_details, input_data) VALUES 
        ('Unique Constraint', v_error_message, 'User ID: ' || p_user_id || ', Email: ' || p_email);
        -- 2. ส่งข้อความที่ User เข้าใจได้
        RETURN 'Error: ข้อมูลนี้ถูกใช้งานไปแล้ว กรุณาลองข้อมูลอื่น';
    -- ดักจับข้อผิดพลาดทั่วไป
    WHEN others THEN
        GET STACKED DIAGNOSTICS v_error_message = MESSAGE_TEXT;
        INSERT INTO log_errors (error_type, error_details, input_data) VALUES 
        ('General Error', v_error_message, 'Input Data: ' || p_email);
        RETURN 'Error: เกิดข้อผิดพลาดทางระบบ กรุณาลองใหม่อีกครั้ง';
END;$$ LANGUAGE plpgsql;

ตารางสรุปการเชื่อมโยง HTTP Error กับ PostgreSQL Log

การทำความเข้าใจความสัมพันธ์ระหว่าง Status Code และ SQLSTATE จะช่วยให้ทีมพัฒนาสามารถ Debug ได้อย่างรวดเร็ว:

HTTP Status SQLSTATE (PostgreSQL) สาเหตุหลัก Action (Log Data)
400 Bad Request 22007 (invalid-datetime) รูปแบบข้อมูลผิด (Data Type Mismatch) Log: Input Data ที่ผิดรูปแบบ
409 Conflict 23505 (unique-violation) ข้อมูลซ้ำ (Constraint Violation) Log: Constraint Name, ค่าที่พยายามใส่
500 Internal Error P0001 (User Defined) Logic Error/System Failure Log: Stack Trace, Transaction ID, User Session

บทสรุป

การจัดการ Error Logging ที่ดีไม่ใช่แค่การบันทึกข้อความผิดพลาด แต่คือการบันทึก ‘บริบท’ ทั้งหมดที่นำไปสู่ความผิดพลาดนั้นๆ การใช้ PostgreSQL’s EXCEPTION block ร่วมกับการบันทึก SQLSTATE และข้อมูล Input ที่เป็นสาเหตุ จะช่วยให้ทีมพัฒนาสามารถย้อนรอย (Trace) ปัญหาได้อย่างสมบูรณ์ ทำให้การแก้ไขระบบเป็นไปอย่างรวดเร็วและมั่นคงในระดับ Senior Architect