Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การ Log Error ด้วย PDO

บทนี้เน้นย้ำความสำคัญของการ Log Error ที่เกิดจากการใช้งาน PDO ใน PHP เพื่อช่วยในการวิเคราะห์และแก้ไขปัญหาของแอปพลิเคชันได้อย่างมีประสิทธิภาพ โดยอธิบายถึงวิธีการ...

การ Log Error ด้วย PDO

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการจัดการ Error ด้วย try-catch block เมื่อใช้งาน PDO ใน PHP การดักจับ Error เป็นเพียงขั้นตอนแรก สิ่งสำคัญคือการบันทึก (Log) Error เหล่านั้น เพื่อให้เราสามารถวิเคราะห์และแก้ไขปัญหาที่เกิดขึ้นในภายหลังได้อย่างมีประสิทธิภาพ ในบทนี้ เราจะมาเรียนรู้วิธีการ Log Error ที่เกิดจาก PDO ลงใน Log file อย่างละเอียด

ทำไมต้อง Log Error?

การ Log Error มีประโยชน์อย่างมากในการพัฒนาและดูแลรักษาเว็บไซต์หรือแอปพลิเคชัน ดังนี้:

  • การวิเคราะห์ปัญหา: Log file ช่วยให้เราสามารถตรวจสอบ Error ที่เกิดขึ้น, เวลาที่เกิด, และรายละเอียดอื่นๆ ที่เกี่ยวข้อง เพื่อหาสาเหตุของปัญหา
  • การแก้ไขปัญหา: ข้อมูลใน Log file ช่วยให้เราสามารถแก้ไขปัญหาได้อย่างตรงจุดและรวดเร็ว
  • การติดตามพฤติกรรม: Log file สามารถใช้เพื่อติดตามพฤติกรรมของระบบและผู้ใช้งาน เพื่อระบุจุดที่ต้องปรับปรุง
  • การรักษาความปลอดภัย: Log file ช่วยในการตรวจสอบกิจกรรมที่น่าสงสัย เช่น การพยายามเข้าถึงข้อมูลโดยไม่ได้รับอนุญาต

การสร้าง Log File

ก่อนที่เราจะเริ่ม Log Error ได้ เราต้องสร้าง Log file ก่อน โดยทั่วไปแล้ว เราจะสร้างไฟล์ชื่อ error.log หรือ pdo_error.log ไว้ใน directory ที่เหมาะสม เช่น /logs/ หรือ /tmp/ ขึ้นอยู่กับการตั้งค่าของระบบปฏิบัติการและ web server ของคุณ

ข้อควรระวัง: ตรวจสอบให้แน่ใจว่า web server มีสิทธิ์ในการเขียนไฟล์ลงใน directory ที่คุณเลือก

ตัวอย่างการสร้าง Log file (ด้วยตนเอง):

touch /path/to/your/logs/pdo_error.log
chmod 644 /path/to/your/logs/pdo_error.log

คำสั่งข้างต้นจะสร้างไฟล์ pdo_error.log และกำหนดสิทธิ์ให้ web server สามารถอ่านและเขียนไฟล์ได้

การเขียน Error Message ลงใน Log File

เมื่อเรามี Log file แล้ว เราสามารถเขียน Error message ลงไปได้ โดยใช้ฟังก์ชัน error_log() ใน PHP

รูปแบบการใช้งาน:

error_log(string $message, int $message_type = 0, string $destination = null, string $extra_headers = null): bool
  • $message: ข้อความ Error ที่ต้องการบันทึก
  • $message_type: ประเภทของข้อความ (ค่าเริ่มต้นคือ 0 ซึ่งจะส่งข้อความไปยัง Log file ของ server)
  • $destination: ปลายทางของข้อความ (เช่น อีเมล หรือไฟล์)
  • $extra_headers: Headers เพิ่มเติม (ใช้เมื่อส่งอีเมล)

ตัวอย่างการใช้งานร่วมกับ PDO:

<?php

$logFile = '/path/to/your/logs/pdo_error.log';

try {
  $dsn = 'mysql:host=localhost;dbname=mydatabase;charset=utf8mb4';
  $username = 'your_username';
  $password = 'your_password';

  $pdo = new PDO($dsn, $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // ตัวอย่างการ Query ที่อาจทำให้เกิด Error
  $stmt = $pdo->prepare("SELECT * FROM non_existent_table");
  $stmt->execute();

} catch (PDOException $e) {
  $errorMessage = "Error: " . $e->getMessage() . "\n";
  $errorMessage .= "File: " . $e->getFile() . "\n";
  $errorMessage .= "Line: " . $e->getLine() . "\n";
  $errorMessage .= "Timestamp: " . date('Y-m-d H:i:s') . "\n";

  error_log($errorMessage, 3, $logFile); // 3 คือการเขียนลงไฟล์

  echo "เกิดข้อผิดพลาด โปรดตรวจสอบ Log file";
}

?>

คำอธิบาย:

  • เรากำหนด path ของ Log file ไว้ในตัวแปร $logFile
  • ใน try-catch block เราดักจับ PDOException
  • เมื่อเกิด Error เราสร้างข้อความ Error ที่ประกอบด้วย:
    • ข้อความ Error ($e->getMessage())
    • ชื่อไฟล์ที่เกิด Error ($e->getFile())
    • บรรทัดที่เกิด Error ($e->getLine())
    • Timestamp
  • เราใช้ error_log() เพื่อเขียนข้อความ Error ลงใน Log file โดยกำหนด $message_type เป็น 3 ซึ่งหมายถึงการเขียนลงไฟล์
  • สุดท้าย เราแสดงข้อความแจ้งเตือนผู้ใช้ว่าเกิด Error และให้ตรวจสอบ Log file

การ Rotate Log File

Log file สามารถมีขนาดใหญ่ขึ้นเรื่อยๆ เมื่อเวลาผ่านไป ซึ่งอาจทำให้เปลืองพื้นที่ disk และยากต่อการวิเคราะห์ ดังนั้น เราจึงควรทำการ Rotate Log file เป็นประจำ

การ Rotate Log file คือการเปลี่ยนชื่อ Log file ปัจจุบัน และสร้าง Log file ใหม่ โดยปกติแล้ว เราจะ Rotate Log file ตามช่วงเวลา (เช่น ทุกวัน ทุกสัปดาห์ หรือทุกเดือน) หรือตามขนาดของไฟล์

มีหลายวิธีในการ Rotate Log file:

  1. Manual Rotation: ใช้ script หรือ command-line tool เพื่อเปลี่ยนชื่อและสร้าง Log file ใหม่ด้วยตนเอง
  2. Logrotate: ใช้โปรแกรม logrotate ซึ่งเป็นเครื่องมือมาตรฐานบน Linux สำหรับการจัดการ Log file
  3. Libraries: ใช้ library ของ PHP ที่ช่วยในการจัดการ Log file

ตัวอย่างการใช้ logrotate (บน Linux):

สร้างไฟล์ configuration สำหรับ logrotate เช่น /etc/logrotate.d/pdo_error:

/path/to/your/logs/pdo_error.log {
  daily
  rotate 7
  missingok
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
    /usr/bin/chmod 644 /path/to/your/logs/pdo_error.log
  endscript
}

คำอธิบาย:

  • daily: Rotate Log file ทุกวัน
  • rotate 7: เก็บ Log file ไว้ 7 วัน
  • missingok: ไม่ต้องแสดง Error หาก Log file หายไป
  • notifempty: ไม่ต้อง Rotate หาก Log file ว่าง
  • compress: บีบอัด Log file ที่ถูก Rotate
  • delaycompress: บีบอัด Log file ในวันถัดไป
  • sharedscripts: รัน script หลังการ Rotate เพียงครั้งเดียว
  • postrotate: Script ที่จะรันหลังการ Rotate
  • /usr/bin/chmod 644 /path/to/your/logs/pdo_error.log: กำหนดสิทธิ์ของ Log file ใหม่

หลังจากสร้างไฟล์ configuration แล้ว logrotate จะทำการ Rotate Log file ตามกำหนดเวลา

ข้อผิดพลาดที่พบบ่อย

  • Permission Denied: Web server ไม่มีสิทธิ์ในการเขียน Log file ตรวจสอบสิทธิ์ของ directory และไฟล์
  • Log File ไม่ถูก Rotate: ตรวจสอบการตั้งค่า logrotate และตรวจสอบว่า logrotate ทำงานตามกำหนดเวลา
  • Log File มีขนาดใหญ่เกินไป: ปรับการตั้งค่า logrotate ให้เหมาะสม หรือใช้ library ที่มีการจัดการ Log file ที่ดีกว่า

สรุป

การ Log Error เป็นสิ่งสำคัญในการพัฒนาและดูแลรักษาเว็บไซต์หรือแอปพลิเคชัน การบันทึก Error ที่เกิดจาก PDO ลงใน Log file ช่วยให้เราสามารถวิเคราะห์และแก้ไขปัญหาได้อย่างมีประสิทธิภาพ อย่าลืม Rotate Log file เป็นประจำเพื่อป้องกันปัญหาเรื่องพื้นที่ disk และความยากในการวิเคราะห์

ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการใช้ PDO กับ Pagination เพื่อแบ่งข้อมูลจำนวนมากออกเป็นหน้าๆ เพื่อให้ผู้ใช้งานสามารถเรียกดูข้อมูลได้อย่างสะดวก

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service