ใช้งาน log4php เพื่อเก็บ log file สำหรับ PHP web application

Tags: php

log4php เป็น library ที่ถูก export จาก project log4j ของฝั่ง Java เป็นชุดคำสั่งที่ช่วยอำนวยความสะดวกในการสร้าง log file

โดย log file นี้จะจัดเก็บข้อความที่แบ่งออกเป็น 6 ระดับ

ระดับ | ความสำคัญ | คำอธิบาย --- | --- | --- FATAL | Highest | Very severe error events that will presumably lead the application to abort. ERROR | ... | Error events that might still allow the application to continue running. WARN | ... |Potentially harmful situations which still allow the application to continue running. INFO | ... | Informational messages that highlight the progress of the application at coarse-grained level. DEBUG | ... | Fine-grained informational events that are most useful to debug an application. TRACE | Lowest | Finest-grained informational events.

จะเห็นว่าการเก็บข้อความในรูปแบบ log file จะมีประโยชน์อย่างมากทั้งในด้านค้นหาข้อผิดพลาดของโปรแกรม การเก็บข้อมูลการทำงานของโปรแกรม สามารถที่จะดูข้อมูลย้อนหลังได้ สามารถบันทึกเวลาที่เกิดเหตุการณ์ใดเหตุการณ์หนึ่งใน application ก็ได้

ขึ้นตอนการนำ log4php มาใช้งาน

  • Donwload source code ของ log4php สามารถ download ได้จากที่นี่ (เนื่องจากเป็น post เก่าที่ migrate สำหรับ project ใหม่ๆ แนะนำให้ติดตั้งผ่าน composer แทนนะครับ)
  • สร้าง log4php configuration file (xml file) ตัวอย่าง log4php.xml
<?xml version="1.0" encoding="UTF-8"?>
<log4php:configuration xmlns:log4php="http://logging.apache.org/log4php/">
    <appender name="appenderName" class="LoggerAppenderDailyFile"> <!-- 1 -->
        <param name="datePattern" value="Y-m-d" /> <!-- 2 -->
        <param name="file" value="messageLog-%s.txt" />  <!-- 3 -->   
        <layout class="LoggerLayoutPattern"> <!-- 4 -->
            <param name="conversionPattern" 
            value="%d{Y-m-d H:i:s.u} %F %c %-5p %m%n" /> <!-- 5 -->
        </layout>   
    </appender>                    
    <root>
        <level value="WARN" />  <!-- 6 -->           
        <appender_ref ref="appenderName" /> <!-- 7 -->
    </root>
</log4php:configuration>

คำอธิบายตามหมายเลขที่ได้กำกับไว้ใน configuration file

  • appender เป็นตัวที่ไว้กับหนดว่า log ที่สร้างขึ้นจะเก็บข้อความไว้ที่ใด ที่ appender element ทำการระบุชื่อของ appender ที่ต้อง unique ระบุชื่อ class ของ appender ในตัวอย่าง กำหนดเป็น LoggerAppenderDailyFile ข้อความที่ถูกสร้างขึ้นจะถูกเก็บลง text file และแต่ละวันจะมีการ text file ใหม่ขึ้นมา
  • กำหนดรูปแบบของวันที่เพื่อใช้เป็นส่วนหนึ่งของชื่อ log file ในตัวอย่างนี้คือ Y-m-d วันที่จะออกมาในรูปแบบ 2011-09-14
  • กำหนดชือของ log file พร้อม path ในตัวอย่างในกำหนดเฉพาะชื่อของ file เพียงอย่างเดียว (กำหนดแบบ relative) ดังนั้น text file ที่ได้จะถูกสร้างขึ้นมาในระดับเดียวกับ php file ที่สร้าง log file นี้ขึ้นมา ต้องกำหนด %s เข้าไปในชื่อของ log file ซึ่ง %s จะถูกแทนที่ด้วยรูปแบบของวันที่ที่กำหนดไว้ในข้อ 2
  • กำหนดชื่อ class ที่ชื่อว่า LoggerLayoutPattern ให้กับ layout เพื่อกำหนดรูปแบบของข้อความที่จะเขียนลง text file ขึ้นมาเอง
  • กำหนดรูปแบบของข้อความที่จะเก็บลง log file โดยตัวแปรแต่ละตัวมีความหมายดังนี้
%d{ y-m-d H:i:s.u}  ปี เดือน วัน ชม. นาที วินาที ตามลำดับ
%F php  file ที่สร้างข้อความ
%c ชื่อของ log ที่ได้กำหนดไว้ตอนสร้าง log ภายในชุดคำสั่งของ php
%-5p ระดับของข้อความ
%m ข้อความ
%n line break
  • กำหนดว่าทุก log ที่มีระดับตั้งแต่ WARN จะถูกเขียนลง text file
  • กำหนด appender ที่จะใช้สำหรับ log ทั้งหมดใน application ในตัวอย่างนี้ข้อความทั้งหมดจะถูกเขียนลง text file

สร้าง php file (testLog.php) เพื่อทดลองการใช้งาน

<?php
//include log4php เข้ามา
include('log4php/Logger.php');

// กำหนด configuration ที่ได้สร้างไว้
Logger::configure('log4php.xml');

// สร้าง logger เพื่อไว้เขียนข้อความ
$log = Logger::getLogger('loggerName');

//เริ่มทำการเขียนลง text file
$log->trace("This is trace message.");   //ไม่ถูกเขียนลง text file เนื่องจาก TRACE < WARN
$log->debug("This is debug message.");  //ไม่ถูกเขียนลง text file เนื่องจาก DEBUG < WARN
$log->info("This is info message.");    //ไม่ถูกเขียนลง text file เนื่องจาก INFO < WARN
$log->warn("This is warn message.");   //ไม่ถูกเขียนลง text file เนื่องจาก WARN >= WARN
$log->error("This is error message.");   //ไม่ถูกเขียนลง text file เนื่องจาก ERROR >= WARN
$log->fatal("This is fatal message.");   //ไม่ถูกเขียนลง text file เนื่องจาก FATAL >= WARN

?>

run php file ที่ได้สร้างขึ้นมา

messageLog-2011-09-14.txt จะถูกสร้างขึ้นมาโดยอัตโนมัต และภายใน text file นี้จะมีข้อความดังนี้

2011-09-14 20:14:55.645 C:\AppServ\www\log4php\testLog.php loggerName WARN  This is warn message.
2011-09-14 20:14:55.646 C:\AppServ\www\log4php\testLog.php loggerName ERROR This is error message.
2011-09-14 20:14:55.646 C:\AppServ\www\log4php\testLog.php loggerName FATAL This is fatal message.

อ้างอิงจาก http://logging.apache.org/log4php/