Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2004/10/16

counter hits
since 1999/11/06


log4php - PHP版log4j

以前、NullObjectパターンを使ったlog4jもどき(本物には遠く及びもしません)をつくって遊んでいましたが、log4jのPHP版プロジェクトが本当に進んでいるようです。その名も「log4php」。。。そのままなネーミング。。。

こちらの方は、2004/3/7付けでApacheのLogging Services Projectの方で活動をしているようで、Javaで一般的になっているロギングフレームワークであるlog4jを様々な言語(C++、Perlを初め、なんとPL/SQLも!)へポートしているようです。なお、完全にlog4jと同じ機能が実装されているわけではないので、log4phpの実装状況を確認しておくことをオススメします。

log4phpは、Log4php本家から入手することができます。2004/07/19現在、バージョン0.9が最新です。入手したtar.gzあるいはzipは、適当なディレクトリに展開します。展開後、log4php-0.9/src/log4phpディレクトリをPHPスクリプトからrequire/include可能なディレクトリにコピー、あるいはシンボリックリンクを作成しておきます。インストール手順はこれだけです。

使い方ですが、まず、設定ファイル(log4php.properties)を作成します。設定内容は、ほぼlog4j.propertiesと同じですので、詳細はlog4jのドキュメントサイトを参照してください。最もシンプルな内容は以下のような感じで、ざっくりな説明は以下の通りです。

  • デバッグレベルのログ出力(※1)
  • 日毎にログファイルを作成する。ファイル名は[YYYYMMDD].log。(※2)
  • 出力フォーマットは、ログメッセージそのまま(※3)
●log4php.properties
#---------------------------------
# ルートLoggerの定義
#
# @rotete daily
# @logfile /path/to/log/%s.log
# @layout LayoutSimple
#---------------------------------
log4php.rootLogger=DEBUG, R (※1)
log4php.appender.R=LoggerAppenderDailyFile (※2)
log4php.appender.R.file=/path/to/log/%s.log (※2)
log4php.appender.R.layout=LoggerLayoutSimple (※3)

ここで、fileで指定しているディレクトリのpermissionを確認し、ApacheのUser/Groupで書き込みができるようにしておいて下さい。

次に、PHPスクリプトを記述します。この中では、

  • LoggerManager.phpのrequire/include
  • LoggerManagerからLoggerオブジェクトの取得
  • 定数LOG4PHP_CONFIGURATIONの定義(オプション)
  • 定数LOG4PHP_CONFIGURATION_CLASSの定義(オプション)
  • ログの出力
  • LoggerManagerオブジェクトのシャットダウン

を記述します。

●first_log4php.php

<?php
/**
 * log4phpのインストールディレクトリ
 */
define('LOG4PHP_DIR', 'log4php');

/**
 * プロパティファイルの指定
 */
define('LOG4PHP_CONFIGURATION', './log4php.properties');

require_once(LOG4PHP_DIR . '/LoggerManager.php');
?>
<?php
    /**
     * Loggerの取得
     * スクリプト名をLogger名として渡す
     */
    $logger =& LoggerManager::getLogger(basename($_SERVER['SCRIPT_NAME']));

    /**
     * ログの出力
     */
    $logger->debug('DEBUGメッセージです');
    $logger->info('INFOメッセージです');
    $logger->warn('WARNメッセージです');
    $logger->error('ERRORメッセージです');
    $logger->fatal('FATALメッセージです');

    /**
     * シャットダウン
     */
    LoggerManager::shutdown();
?>

実行してみると、log4php.propertiesで指定したディレクトリに、以下のような内容の[YYYYMMDD].log(例:20040719.log)が作成されているはずです。

●ログファイル
DEBUG - DEBUGメッセージです
INFO - INFOメッセージです
WARN - WARNメッセージです
ERROR - ERRORメッセージです
FATAL - FATALメッセージです

ここで、appenderとlayoutをもうちょっと掘り下げてみましょう。

appenderは簡単に言うとログの出力先であり、ファイルだけではなく、コンソールソケット(この場合、リモートなソケットサーバへの出力)、Syslogメールデータベース等が指定できます。また、ファイルについては、サイズ毎日付毎のローテートを行うものもあります。また、PHPスクリプト毎に異なるappenderを割り当てたり、複数のappenderを割り当てることも可能です。なお、LoggerAppenderMailなど、内部的にPEARを使用するappenderもあるので注意が必要です。その場合、予めpearコマンド等でインストールしておきましょう。

layoutは、ログメッセージのフォーマットを指定するもので、メッセージのみHTMLのtable形式ユーザー指定のパターンXML形式等があります。

以下、propertiesファイルの例をいくつか。。。

まずは、出力フォーマットを定義する場合の例です。

●log4php.properties
#---------------------------------
# @rotete daily
# @logfile ./log/error_log_%s.txt
# @pattern %d [%t] %-5p %c - %m%n
#---------------------------------
log4php.rootLogger=DEBUG, R
log4php.appender.R=LoggerAppenderDailyFile
log4php.appender.R.file=./log/error_log_%s.txt
log4php.appender.R.layout=LoggerPatternLayout
log4php.appender.R.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
  
●出力結果
2004-07-19 15:56:03,041 [29220] DEBUG log4php.php - DEBUGメッセージです
2004-07-19 15:56:03,043 [29220] INFO  log4php.php - INFOメッセージです
2004-07-19 15:56:03,045 [29220] WARN  log4php.php - WARNメッセージです
2004-07-19 15:56:03,047 [29220] ERROR log4php.php - ERRORメッセージです
2004-07-19 15:56:03,048 [29220] FATAL log4php.php - FATALメッセージです
  

次に、log4php_01.phpのみに適用する場合の例です。また、出力フォーマットをXMLとしています。このログ、かなりでかくなるので注意が必要です。

●log4php.properties
#---------------------------------
# @logger log4php_01.php
# @rotete daily
# @logfile ./log/R01_log_%s.txt
#---------------------------------
log4php.logger.log4php_01=DEBUG, R01
log4php.appender.R01=LoggerAppenderDailyFile
log4php.appender.R01.file=./log/R01_log_%s.txt
log4php.appender.R01.layout=LoggerXmlLayout
log4php.appender.R01.layout.LocationInfo=true
  
●出力結果
<log4j:eventSet xmlns:log4j="http://jakarta.apache.org/log4j/" version="0.3" includesLocationInfo="true">
</log4j:eventSet>
<log4j:eventSet xmlns:log4j="http://jakarta.apache.org/log4j/" version="0.3" includesLocationInfo="true">
</log4j:eventSet>
<log4j:eventSet xmlns:log4j="http://jakarta.apache.org/log4j/" version="0.3" includesLocationInfo="true">
<log4j:event logger="log4php_01.php" level="DEBUG" thread="29228" timestamp="1090246276538">
<log4j:message><![CDATA[DEBUGメッセージです]]></log4j:message>
<log4j:locationInfo class="main" file="/path/to/log4php/log4php.phl" line="23" method="main" />
</log4j:event>

<log4j:event logger="log4php_01.php" level="INFO" thread="29228" timestamp="1090246276541">
<log4j:message><![CDATA[INFOメッセージです]]></log4j:message>
<log4j:locationInfo class="main" file="/path/to/log4php/log4php.phl" line="24" method="main" />
</log4j:event>

<log4j:event logger="log4php_01.php" level="WARN" thread="29228" timestamp="1090246276560">
<log4j:message><![CDATA[WARNメッセージです]]></log4j:message>
<log4j:locationInfo class="main" file="/path/to/log4php/log4php.phl" line="25" method="main" />
</log4j:event>

<log4j:event logger="log4php_01.php" level="ERROR" thread="29228" timestamp="1090246276583">
<log4j:message><![CDATA[ERRORメッセージです]]></log4j:message>
<log4j:locationInfo class="main" file="/path/to/log4php/log4php.phl" line="26" method="main" />
</log4j:event>

<log4j:event logger="log4php_01.php" level="FATAL" thread="29228" timestamp="1090246276586">
<log4j:message><![CDATA[FATALメッセージです]]></log4j:message>
<log4j:locationInfo class="main" file="/path/to/log4php/log4php.phl" line="27" method="main" />
</log4j:event>
  

最後は、log4php_02.phpのみに適用し、適用するappenderを2つにした場合の例です。1つ目はサイズ毎(この場合1024bytes)にローテートし、バックアップ世代は3つという設定です。バックアップされたファイルのファイル名は、rotatelogsと同様に最後に「.n」(nは1,2,3...)が付きます。2つ目はエラーレベルERROR以上の場合に指定したアドレスにメールを送信する、というものです。出力フォーマットは、いずれも「出力フォーマットを定義する場合」と同じものです。

●log4php.properties
#---------------------------------
# @logger log4php_02.php
# @rotete rolling
# @logfile ./log/R02_log_%s.txt
# @filesize 1024
# @backup 3
#---------------------------------
log4php.logger.log4php_02=DEBUG, R02, R03
log4php.appender.R02=LoggerAppenderRollingFile
log4php.appender.R02.file=./log/R02_log.txt
log4php.appender.R02.layout=LoggerPatternLayout
log4php.appender.R02.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4php.appender.R02.MaxFileSize=1024
log4php.appender.R02.MaxBackupIndex=3

#---------------------------------
# @logger log4php_02.php
# @rotete mail
# @from system@example.com
# @to admins@example.com
# @subject 'SYSTEM REPORT'
# @threshold ERROR
#---------------------------------
log4php.appender.R03=LoggerAppenderMail
log4php.appender.R03.layout=LoggerPatternLayout
log4php.appender.R03.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4php.appender.R03.from=system@example.com
log4php.appender.R03.to=admins@example.com
log4php.appender.R03.subject="SYSTEM REPORT"
log4php.appender.R03.threshold=ERROR
  

私自身、Javaを使った仕事でlog4jを使っていましたが、本当に違和感なく使うことができましたので、log4jを使ったことがある方ならすぐにでも使えると思います。使ったことがない方でも、最近ではlog4jの日本語ドキュメントも豊富ですので、一度使ってみてはどうでしょうか?。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2004 by Hideyuki SHIMOOKA all rights reserved.