การบันทึก Log ด้วย Monolog
หลังจากที่เราได้ติดตั้ง Monolog และตั้งค่า Logger, Handler และ Formatter เรียบร้อยแล้ว ขั้นตอนต่อไปคือการนำ Monolog มาใช้งานจริง นั่นคือการบันทึกข้อความ Log ในระดับต่างๆ เพื่อช่วยในการติดตามและแก้ไขปัญหาของระบบ บทนี้จะสอนวิธีการบันทึก Log Message ด้วย Monolog ในระดับต่างๆ พร้อมตัวอย่างการใช้งานจริง
ระดับของ Log Message ใน Monolog
Monolog กำหนดระดับความสำคัญของ Log Message ไว้หลายระดับ ซึ่งแต่ละระดับมีความหมายและการใช้งานที่แตกต่างกัน ดังนี้:
- Debug: ใช้สำหรับข้อมูลที่เป็นประโยชน์ในการ Debug โปรแกรมเท่านั้น เช่น ค่าตัวแปร หรือขั้นตอนการทำงานภายใน
- Info: ใช้สำหรับข้อมูลทั่วไปเกี่ยวกับระบบ เช่น การเริ่มต้นหรือสิ้นสุดการทำงานของ Function
- Notice: ใช้สำหรับเหตุการณ์ที่อาจต้องให้ความสนใจในอนาคต แต่ยังไม่ถือว่าเป็น Error
- Warning: ใช้สำหรับเหตุการณ์ที่อาจทำให้เกิดปัญหาในอนาคต เช่น การใช้ Function ที่ Deprecated
- Error: ใช้สำหรับ Error ที่เกิดขึ้นในระบบ แต่ยังไม่ทำให้ระบบหยุดทำงาน
- Critical: ใช้สำหรับ Error ที่ร้ายแรงจนอาจทำให้ระบบหยุดทำงาน
- Alert: ใช้สำหรับ Error ที่ต้องได้รับการแก้ไขโดยทันที
- Emergency: ใช้สำหรับ Error ที่ร้ายแรงที่สุด และต้องได้รับการแก้ไขโดยด่วน
โดยทั่วไปแล้ว เรามักจะใช้ระดับ Debug, Info, Warning, Error และ Critical เป็นหลัก
ตัวอย่างการใช้งาน Monolog เพื่อบันทึก Log
สมมติว่าเรามี Logger ที่ตั้งค่าไว้แล้ว ดังนี้:
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// สร้าง Logger
$log = new Logger('my_app');
// สร้าง Handler (บันทึกลงไฟล์)
$stream = new StreamHandler('path/to/your.log', Logger::DEBUG);
// เพิ่ม Handler ให้กับ Logger
$log->pushHandler($stream);
ต่อไปนี้คือตัวอย่างการบันทึก Log Message ในระดับต่างๆ:
Debug
ใช้สำหรับบันทึกข้อมูลที่เป็นประโยชน์ในการ Debug เช่น ค่าตัวแปร:
$username = 'john.doe';
$log->debug('User logged in', ['username' => $username]);
ในตัวอย่างนี้ เราบันทึกข้อความ 'User logged in' พร้อมกับข้อมูลเพิ่มเติมเป็น Array ที่มี Key 'username' และ Value เป็นชื่อผู้ใช้ ข้อมูลนี้จะช่วยให้เรา Debug ได้ง่ายขึ้น หากเกิดปัญหาเกี่ยวกับการ Login
Info
ใช้สำหรับบันทึกข้อมูลทั่วไปเกี่ยวกับระบบ เช่น การเริ่มต้นหรือสิ้นสุดการทำงานของ Function:
$log->info('Starting user registration process');
// ... โค้ดสำหรับการลงทะเบียนผู้ใช้ ...
$log->info('User registration completed successfully');
การบันทึก Info Log ช่วยให้เราทราบลำดับการทำงานของระบบ และสามารถตรวจสอบได้ว่าแต่ละขั้นตอนทำงานได้ตามปกติ
Warning
ใช้สำหรับเหตุการณ์ที่อาจทำให้เกิดปัญหาในอนาคต เช่น การใช้ Function ที่ Deprecated:
$log->warning('Deprecated function used: mysql_connect()');
Warning Log ช่วยให้เราทราบว่ามี Code ส่วนใดที่ควรปรับปรุง เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้นในอนาคต
Error
ใช้สำหรับ Error ที่เกิดขึ้นในระบบ แต่ยังไม่ทำให้ระบบหยุดทำงาน เช่น การไม่พบไฟล์:
try {
$fileContent = file_get_contents('non_existent_file.txt');
} catch (\Exception $e) {
$log->error('Failed to read file', ['exception' => $e]);
}
ในตัวอย่างนี้ เราใช้ Try-Catch เพื่อจัดการ Exception ที่อาจเกิดขึ้นจากการอ่านไฟล์ ถ้าเกิด Exception ขึ้น เราจะบันทึก Error Log พร้อมกับ Exception Object เพื่อให้ทราบรายละเอียดของ Error
Critical
ใช้สำหรับ Error ที่ร้ายแรงจนอาจทำให้ระบบหยุดทำงาน เช่น การเชื่อมต่อ Database ล้มเหลว:
try {
$db = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'password');
} catch (\PDOException $e) {
$log->critical('Database connection failed', ['exception' => $e]);
// อาจจะต้องทำการหยุดการทำงานของระบบในกรณีนี้
die('Failed to connect to database');
}
Critical Log บ่งบอกถึงปัญหาที่ต้องได้รับการแก้ไขโดยด่วน และอาจจะต้องทำการหยุดการทำงานของระบบชั่วคราว เพื่อป้องกันความเสียหายที่อาจเกิดขึ้น
การส่ง Context Data ไปพร้อมกับ Log Message
Monolog อนุญาตให้เราส่งข้อมูลเพิ่มเติมไปพร้อมกับ Log Message ได้ โดยข้อมูลนี้จะถูกบันทึกไว้ใน Log File และสามารถนำไปใช้ในการวิเคราะห์ปัญหาได้ ข้อมูลเพิ่มเติมนี้เรียกว่า "Context Data" และสามารถส่งไปในรูปแบบ Array ได้:
$user_id = 123;
$product_id = 456;
$log->info('User viewed product', ['user_id' => $user_id, 'product_id' => $product_id]);
Context Data ช่วยให้เราทราบรายละเอียดเพิ่มเติมเกี่ยวกับเหตุการณ์ที่เกิดขึ้น เช่น User ID และ Product ID ในตัวอย่างข้างต้น
ข้อผิดพลาดที่พบบ่อยในการใช้งาน Monolog
- ลืมติดตั้ง Monolog: ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Monolog ผ่าน Composer แล้ว
- ไม่ได้ตั้งค่า Handler: Logger จะไม่ทำงานถ้าไม่ได้กำหนด Handler ให้กับมัน
- Level ของ Handler ไม่ถูกต้อง: ตรวจสอบให้แน่ใจว่า Level ของ Handler ครอบคลุม Level ของ Log Message ที่ต้องการบันทึก
- Path ของ Log File ไม่ถูกต้อง: ตรวจสอบให้แน่ใจว่า Path ของ Log File ถูกต้อง และ PHP มีสิทธิ์ในการเขียนไฟล์ใน Path นั้น
- ลืม Require Autoload: ตรวจสอบให้แน่ใจว่าได้ Require Autoload File ของ Composer แล้ว
สรุป
การบันทึก Log เป็นสิ่งสำคัญในการพัฒนาและดูแลรักษาระบบ การใช้ Monolog ช่วยให้เราสามารถบันทึก Log Message ในระดับต่างๆ พร้อมกับข้อมูลเพิ่มเติมได้อย่างมีประสิทธิภาพ ทำให้เราสามารถติดตามและแก้ไขปัญหาของระบบได้อย่างรวดเร็วและแม่นยำ อย่าลืมที่จะเลือกใช้ Level ของ Log Message ให้เหมาะสมกับสถานการณ์ และส่ง Context Data ไปพร้อมกับ Log Message เพื่อให้ได้ข้อมูลที่เป็นประโยชน์ในการวิเคราะห์ปัญหา
ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการจัดการ Environment Variables ซึ่งเป็นอีกหนึ่งเครื่องมือที่สำคัญในการพัฒนา Application