본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

Monolog คืออะไร และทำไมถึงนิยมใช้?

บทความนี้แนะนำ Monolog ซึ่งเป็น Logging Library ยอดนิยมสำหรับ PHP ที่ช่วยให้การบันทึกเหตุการณ์ในระบบเป็นเรื่องง่ายและมีประสิทธิภาพ ด้วยความยืดหยุ่นในการปรับแต่ง...

Monolog คืออะไร และทำไมถึงนิยมใช้?

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

Monolog คือ Logging Library ที่ได้รับความนิยมอย่างมากใน PHP มันช่วยให้เราสามารถบันทึกเหตุการณ์ต่างๆ ที่เกิดขึ้นในระบบได้อย่างง่ายดาย และยังมีความยืดหยุ่นสูงในการปรับแต่งรูปแบบการบันทึกและปลายทางที่จะบันทึก Log อีกด้วย

Logging Library คืออะไร?

Logging Library คือชุดของโค้ดที่ช่วยให้เราสามารถบันทึกข้อความ, ตัวแปร, หรือข้อมูลอื่นๆ ที่เกี่ยวข้องกับเหตุการณ์ที่เกิดขึ้นในระบบของเราได้อย่างง่ายดาย โดยปกติแล้ว Logging Library จะมีฟังก์ชันสำหรับการกำหนดระดับความสำคัญของ Log (เช่น Debug, Info, Warning, Error, Critical) และฟังก์ชันสำหรับการส่ง Log ไปยังปลายทางต่างๆ (เช่น ไฟล์, ฐานข้อมูล, อีเมล)

ทำไม Monolog ถึงได้รับความนิยม?

Monolog ได้รับความนิยมอย่างมากใน PHP เนื่องจากมีข้อดีหลายประการ ดังนี้:

  • ใช้งานง่าย: Monolog มี API ที่เรียบง่าย ทำให้ง่ายต่อการเรียนรู้และใช้งาน
  • ยืดหยุ่นสูง: Monolog รองรับการปรับแต่งรูปแบบการบันทึกและปลายทางการบันทึกได้อย่างหลากหลาย
  • รองรับหลาย Handler: Monolog สามารถส่ง Log ไปยังปลายทางต่างๆ ได้พร้อมกัน เช่น บันทึก Log ลงในไฟล์และส่งอีเมลแจ้งเตือนเมื่อเกิด Error
  • รองรับหลาย Formatter: Monolog สามารถปรับแต่งรูปแบบของ Log ให้เหมาะสมกับแต่ละปลายทางได้ เช่น บันทึก Log ลงในไฟล์ด้วยรูปแบบ Text และส่ง Log ไปยังฐานข้อมูลด้วยรูปแบบ JSON
  • ประสิทธิภาพสูง: Monolog ถูกออกแบบมาให้มีประสิทธิภาพสูง ทำให้ไม่ส่งผลกระทบต่อประสิทธิภาพของระบบโดยรวม
  • รองรับมาตรฐาน PSR-3: Monolog เป็นไปตามมาตรฐาน PSR-3 ซึ่งเป็นมาตรฐานสำหรับ Logging Interface ใน PHP ทำให้สามารถใช้งานร่วมกับ Libraries และ Frameworks อื่นๆ ที่รองรับ PSR-3 ได้อย่างง่ายดาย

แนวคิดหลักของ Monolog

Monolog มีแนวคิดหลักอยู่ 3 อย่างที่สำคัญคือ:

  1. Logger: เป็น Instance หลักที่เราใช้ในการบันทึก Log โดย Logger จะมีหน้าที่รับ Log Message และส่งต่อไปยัง Handler ต่างๆ
  2. Handler: เป็นตัวจัดการปลายทางที่เราต้องการบันทึก Log เช่น FileHandler สำหรับบันทึกลงไฟล์, StreamHandler สำหรับบันทึกลง Stream (เช่น Standard Output), MailHandler สำหรับส่งอีเมล
  3. Formatter: เป็นตัวกำหนดรูปแบบของ Log Message ก่อนที่จะถูกส่งไปยัง Handler

ตัวอย่างง่ายๆ ของการใช้งาน Monolog

เพื่อให้เห็นภาพการใช้งาน Monolog มากขึ้น ลองดูตัวอย่างโค้ดต่อไปนี้:

<?php

require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// สร้าง Logger Instance
$log = new Logger('my_app');

// สร้าง Handler สำหรับบันทึกลงไฟล์
$stream = new StreamHandler('path/to/your.log', Logger::DEBUG);

// เพิ่ม Handler เข้าไปใน Logger
$log->pushHandler($stream);

// บันทึก Log Message
$log->debug('This is a debug message.');
$log->info('This is an info message.');
$log->warning('This is a warning message.');
$log->error('This is an error message.');
$log->critical('This is a critical message.');

?>

จากตัวอย่างโค้ดข้างต้น:

  • เราทำการ `require __DIR__ . '/vendor/autoload.php';` เพื่อโหลด Composer Autoloader ซึ่งทำให้เราสามารถใช้ Class ต่างๆ ของ Monolog ได้
  • เราสร้าง Instance ของ `Monolog\Logger` โดยกำหนดชื่อ Logger เป็น `'my_app'`
  • เราสร้าง Instance ของ `Monolog\Handler\StreamHandler` โดยกำหนด Path ของไฟล์ที่จะบันทึก Log เป็น `'path/to/your.log'` และกำหนด Level ของ Log ที่จะบันทึกเป็น `Logger::DEBUG` (หมายความว่าจะบันทึก Log ที่มี Level ตั้งแต่ Debug ขึ้นไป)
  • เราเพิ่ม Handler ที่สร้างขึ้นเข้าไปใน Logger ด้วย Method `pushHandler()`
  • เราใช้ Method ต่างๆ ของ Logger (เช่น `debug()`, `info()`, `warning()`, `error()`, `critical()`) เพื่อบันทึก Log Message

เมื่อรันโค้ดนี้ จะมีการสร้างไฟล์ `path/to/your.log` ขึ้นมา และภายในไฟล์จะมี Log Message ที่เราบันทึกไว้

Handler หลายตัว

Monolog สามารถใช้ Handler ได้หลายตัวพร้อมกัน ซึ่งหมายความว่าเราสามารถส่ง Log ไปยังปลายทางต่างๆ ได้พร้อมกัน เช่น เราอาจจะต้องการบันทึก Log ลงในไฟล์ และส่งอีเมลแจ้งเตือนเมื่อเกิด Error ลองดูตัวอย่างโค้ดต่อไปนี้:

<?php

require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;

// สร้าง Logger Instance
$log = new Logger('my_app');

// สร้าง Handler สำหรับบันทึกลงไฟล์
$stream = new StreamHandler('path/to/your.log', Logger::DEBUG);

// สร้าง Handler สำหรับส่งอีเมล
$mailer = new NativeMailerHandler(
    'your_email@example.com',
    'Error in My App',
    'your_email@example.com',
    Logger::ERROR
);

// เพิ่ม Handler เข้าไปใน Logger
$log->pushHandler($stream);
$log->pushHandler($mailer);

// บันทึก Log Message
$log->debug('This is a debug message.');
$log->error('This is an error message.');

?>

จากตัวอย่างโค้ดข้างต้น เราได้เพิ่ม Handler อีกตัวหนึ่งคือ `Monolog\Handler\NativeMailerHandler` ซึ่งจะส่งอีเมลแจ้งเตือนเมื่อมี Log ที่มี Level เป็น Error หรือสูงกว่าเกิดขึ้น

Formatter หลายตัว

ถึงแม้ว่าเราจะมี Handler หลายตัว แต่บางครั้งเราอาจต้องการให้แต่ละ Handler ใช้รูปแบบ Log ที่แตกต่างกัน เช่น เราอาจจะต้องการบันทึก Log ลงในไฟล์ด้วยรูปแบบ Text ที่อ่านง่าย แต่ส่ง Log ไปยังฐานข้อมูลด้วยรูปแบบ JSON ที่สามารถนำไปประมวลผลได้ง่าย Monolog สามารถทำได้โดยการกำหนด Formatter ให้กับแต่ละ Handler ลองดูตัวอย่างโค้ดต่อไปนี้:

<?php

require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\JsonFormatter;

// สร้าง Logger Instance
$log = new Logger('my_app');

// สร้าง Handler สำหรับบันทึกลงไฟล์
$stream = new StreamHandler('path/to/your.log', Logger::DEBUG);

// สร้าง Formatter สำหรับบันทึกลงไฟล์
$lineFormatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n");
$stream->setFormatter($lineFormatter);

// สร้าง Handler สำหรับส่งไปยังฐานข้อมูล (สมมติ)
// (ในความเป็นจริงจะต้องมี code เชื่อมต่อฐานข้อมูล)
$database = new StreamHandler('php://output', Logger::DEBUG); // เปลี่ยนเป็น handler ที่ใช้ database จริง
$jsonFormatter = new JsonFormatter();
$database->setFormatter($jsonFormatter);

// เพิ่ม Handler เข้าไปใน Logger
$log->pushHandler($stream);
$log->pushHandler($database);

// บันทึก Log Message
$log->debug('This is a debug message.', ['user_id' => 123]);
$log->error('This is an error message.', ['error_code' => 500]);

?>

จากตัวอย่างโค้ดข้างต้น เราได้สร้าง Formatter 2 ตัวคือ `Monolog\Formatter\LineFormatter` สำหรับบันทึกลงไฟล์ และ `Monolog\Formatter\JsonFormatter` สำหรับส่งไปยังฐานข้อมูล (ในตัวอย่างนี้เราใช้ `StreamHandler` ชั่วคราวเพื่อแสดงผล JSON ไปยัง Standard Output แทนการเชื่อมต่อฐานข้อมูลจริง)

เรากำหนด Formatter ให้กับแต่ละ Handler ด้วย Method `setFormatter()`

จะเห็นได้ว่า Monolog มีความยืดหยุ่นสูงในการปรับแต่งรูปแบบการบันทึกและปลายทางการบันทึก Log ทำให้เราสามารถปรับแต่งการ Logging ให้เหมาะสมกับความต้องการของแต่ละโปรเจกต์ได้อย่างง่ายดาย

ในบทต่อไป เราจะมาดูวิธีการติดตั้ง Monolog ผ่าน Composer และเริ่มต้นใช้งาน Monolog อย่างละเอียดกันครับ

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기