メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

การกำหนด Formatter ใน Monolog

การกำหนด Formatter ใน Monolog

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

Formatter ช่วยให้เราสามารถปรับแต่งข้อมูล Log ให้เหมาะสมกับความต้องการของเรา เช่น การเพิ่ม Timestamp, Severity Level, Message, Context และ Extra ข้อมูลอื่นๆ ที่จำเป็นต่อการวิเคราะห์ปัญหา

Formatter คืออะไร?

Formatter คือคลาสที่แปลง Log Record (Array ที่เก็บข้อมูลของ Log) ให้เป็น String หรือ Format อื่นๆ ที่ Handler สามารถนำไปใช้งานได้ โดย Monolog มี Formatter ให้เลือกใช้งานมากมาย แต่ที่นิยมใช้กันบ่อยๆ ได้แก่:

  • LineFormatter: สร้าง Log ในรูปแบบ Text ที่อ่านง่าย
  • HtmlFormatter: สร้าง Log ในรูปแบบ HTML สำหรับแสดงผลใน Web Browser
  • JsonFormatter: สร้าง Log ในรูปแบบ JSON สำหรับส่งไปยังระบบอื่นๆ
  • LogstashFormatter: สร้าง Log ในรูปแบบที่ Logstash เข้าใจได้

นอกจากนี้ เรายังสามารถสร้าง Custom Formatter ของเราเองได้ หาก Formatter ที่มีอยู่ไม่ตอบโจทย์ความต้องการของเรา

LineFormatter

LineFormatter เป็น Formatter ที่ง่ายที่สุดและนิยมใช้กันมากที่สุด มันจะแปลง Log Record ให้เป็น String โดยใช้ Format ที่เรากำหนดเองได้

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

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

// สร้าง Logger
$logger = new Logger('my_logger');

// สร้าง Handler
$streamHandler = new StreamHandler('path/to/your.log', Logger::DEBUG);

// กำหนด Format
$output = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";
$formatter = new LineFormatter($output, "Y-m-d H:i:s", true, true); // (format, dateFormat, allowInlineLineBreaks, ignoreEmptyContextAndExtra)

// กำหนด Formatter ให้กับ Handler
$streamHandler->setFormatter($formatter);

// กำหนด Handler ให้กับ Logger
$logger->pushHandler($streamHandler);

// บันทึก Log
$logger->debug('This is a debug message.', ['username' => 'john.doe']);
$logger->error('This is an error message.');

ในตัวอย่างนี้ เราได้สร้าง LineFormatter โดยกำหนด Format เป็น [%datetime%] %channel%.%level_name%: %message% %context% %extra%\n ซึ่งมีความหมายดังนี้:

  • %datetime%: Timestamp ของ Log
  • %channel%: Channel ของ Logger
  • %level_name%: Severity Level ของ Log (DEBUG, INFO, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY)
  • %message%: ข้อความของ Log
  • %context%: ข้อมูลเพิ่มเติมที่ส่งมาพร้อมกับ Log (ในรูปแบบ Array)
  • %extra%: ข้อมูลเพิ่มเติมที่ Logger เพิ่มเข้ามาเอง

นอกจากนี้ เรายังได้กำหนด Date Format เป็น Y-m-d H:i:s และเปิดใช้งาน allowInlineLineBreaks และ ignoreEmptyContextAndExtra ซึ่งมีความหมายดังนี้:

  • allowInlineLineBreaks: อนุญาตให้ข้อความ Log มี Line Breaks
  • ignoreEmptyContextAndExtra: ละเว้นการแสดงผล Context และ Extra หากไม่มีข้อมูล

ไฟล์ path/to/your.log จะมีข้อมูล Log ในรูปแบบที่กำหนดไว้ เช่น:

[2023-10-27 10:00:00] my_logger.DEBUG: This is a debug message. {"username":"john.doe"} []
[2023-10-27 10:00:00] my_logger.ERROR: This is an error message. [] []

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

  • ลืมกำหนด Formatter ให้กับ Handler ทำให้ Log ถูกบันทึกในรูปแบบ Default
  • กำหนด Format ที่ไม่ถูกต้อง ทำให้ Log อ่านยาก
  • ไม่ได้เปิดใช้งาน allowInlineLineBreaks ทำให้ข้อความ Log ที่ยาวเกินไปถูกตัด

HtmlFormatter

HtmlFormatter เป็น Formatter ที่สร้าง Log ในรูปแบบ HTML ซึ่งเหมาะสำหรับแสดงผลใน Web Browser

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

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\HtmlFormatter;

// สร้าง Logger
$logger = new Logger('my_logger');

// สร้าง Handler
$streamHandler = new StreamHandler('path/to/your.html', Logger::DEBUG);

// กำหนด Formatter
$formatter = new HtmlFormatter();

// กำหนด Formatter ให้กับ Handler
$streamHandler->setFormatter($formatter);

// กำหนด Handler ให้กับ Logger
$logger->pushHandler($streamHandler);

// บันทึก Log
$logger->debug('This is a debug message.', ['username' => 'john.doe']);
$logger->error('This is an error message.');

ไฟล์ path/to/your.html จะมีข้อมูล Log ในรูปแบบ HTML ซึ่งสามารถเปิดดูได้ใน Web Browser

ข้อดี: อ่านง่ายใน Web Browser, สามารถใส่สีและรูปแบบต่างๆ ได้

ข้อเสีย: ไม่เหมาะสำหรับการวิเคราะห์ Log ด้วยเครื่องมืออัตโนมัติ

Custom Formatter

หาก Formatter ที่มีอยู่ไม่ตอบโจทย์ความต้องการของเรา เราสามารถสร้าง Custom Formatter ของเราเองได้ โดยการ Implement Interface Monolog\Formatter\FormatterInterface

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

use Monolog\Formatter\FormatterInterface;

class MyCustomFormatter implements FormatterInterface
{
    public function format(array $record): string
    {
        // กำหนดรูปแบบ Log ตามต้องการ
        return sprintf(
            "[%s] %s: %s\n",
            $record['datetime']->format('Y-m-d H:i:s'),
            $record['level_name'],
            $record['message']
        );
    }

    public function formatBatch(array $records): string
    {
        $message = '';
        foreach ($records as $record) {
            $message .= $this->format($record);
        }

        return $message;
    }
}

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

// สร้าง Logger
$logger = new Logger('my_logger');

// สร้าง Handler
$streamHandler = new StreamHandler('path/to/your.log', Logger::DEBUG);

// กำหนด Formatter
$formatter = new MyCustomFormatter();

// กำหนด Formatter ให้กับ Handler
$streamHandler->setFormatter($formatter);

// กำหนด Handler ให้กับ Logger
$logger->pushHandler($streamHandler);

// บันทึก Log
$logger->debug('This is a debug message.', ['username' => 'john.doe']);
$logger->error('This is an error message.');

ในตัวอย่างนี้ เราได้สร้าง Custom Formatter ชื่อ MyCustomFormatter โดย Implement Interface FormatterInterface และ Override Method format เพื่อกำหนดรูปแบบ Log ตามที่เราต้องการ

ข้อดี: ยืดหยุ่นสูง, สามารถปรับแต่งรูปแบบ Log ได้ตามต้องการ

ข้อเสีย: ต้องเขียน Code เอง, อาจซับซ้อนหากต้องการรูปแบบที่ซับซ้อน

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

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る