|
以前、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
define('LOG4PHP_DIR', 'log4php');
define('LOG4PHP_CONFIGURATION', './log4php.properties');
require_once(LOG4PHP_DIR . '/LoggerManager.php');
?>
<?php
$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の日本語ドキュメントも豊富ですので、一度使ってみてはどうでしょうか?。
|