การ 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-catchblock เราดักจับPDOException - เมื่อเกิด Error เราสร้างข้อความ Error ที่ประกอบด้วย:
- ข้อความ Error (
$e->getMessage()) - ชื่อไฟล์ที่เกิด Error (
$e->getFile()) - บรรทัดที่เกิด Error (
$e->getLine()) - Timestamp
- ข้อความ Error (
- เราใช้
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:
- Manual Rotation: ใช้ script หรือ command-line tool เพื่อเปลี่ยนชื่อและสร้าง Log file ใหม่ด้วยตนเอง
- Logrotate: ใช้โปรแกรม
logrotateซึ่งเป็นเครื่องมือมาตรฐานบน Linux สำหรับการจัดการ Log file - 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 ที่ถูก Rotatedelaycompress: บีบอัด 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 เพื่อแบ่งข้อมูลจำนวนมากออกเป็นหน้าๆ เพื่อให้ผู้ใช้งานสามารถเรียกดูข้อมูลได้อย่างสะดวก