2005年12月当時、log4php-0.9を使っていた時のメモです。log4phpも暫くバージョンがアップしていないと思っていたら、
http://incubator.apache.org/log4php/index.html
として復活したようですが・・・。でもPHP5対応を謳っている(らしい)バージョン2.0のソースはまだ出ていなかったり。
SF.jpの方で「PHPCommons」プロジェクトの方で対応していたりと、何だかドタバタしてます。
http://sourceforge.jp/projects/phpcommons/
個人的にはPEAR_Logでいいやもう、という感じで、YakiBikiでもPEAR_Logにしています。
但し2005年12月当時は自分の中ではlog4phpだったんです。恐らくお仕事の方でlog4jを使っていたので、設定の仕方とかがそのまま使い回せたからでしょう。あと一応Apache内だったから?かも・・・。
log4phpのバージョン0.9のお話です。
log4phpは、基本は設定ファイルを用意してそれを"LOG4PHP_CONFIGURATION"で指定して使います。そのため、「動的に設定を取得したい(例えばDBからlog4phpの設定を動的に作りたい)場合はどうするの?」となります。
対処の一例が今回ので、 LOG4PHP_CONFIGURATOR_CLASS を利用して、ファイルを使わない自作の設定クラスを指定します。
話を早くするために、とりあえずサンプルです。$logger_propertiesという連想配列を設定として用いるSampleConfiguratorというクラスを作りました。
[SampleConfigurator.php] // クラス名.phpという形式にする必要があります。
<?php
// LOG4PHP_DIRの定義は、タイミング上ここで平気です。
require_once(LOG4PHP_DIR.'/LoggerPropertyConfigurator.php');
class SampleConfigurator extends LoggerPropertyConfigurator {
function SampleConfigurator()
{
$this->loggerFactory = new LoggerDefaultCategoryFactory();
}
// LoggerManagerの初期化関数からこのメソッドがstaticに呼ばれます。
// ので、オーバーライドしておきます。
function configure($url = '')
{
// SampleConfiguratorをnewするように修正します。
$configurator = new SampleConfigurator();
// $configurator = new LoggerPropertyConfigurator(); ←元
$repository =& LoggerManager::getLoggerRepository();
return $configurator->doConfigure($url, $repository);
}
function doConfigure($url, &$repository)
{
// 外部で定義された連想配列(parse_ini_file()したのと同じ形)を使用
global $logger_properties;
$properties = $logger_properties;
return $this->doConfigureProperties($properties, $repository);
}
}
?>
とどのつまり、 parse_ini_file()で読み込んでいたところを、どうにかしてそれと同じ形の連想配列をセットできれば良い わけです。
で、これを利用する側は・・・
$base_dir = realpath(dirname(__FILE__));
define('LOG4PHP_CONFIGURATOR_CLASS', $base_dir.'/SampleConfigurator');
$logger_properties = array(
"log4php.logger.test01" => 'DEBUG, A1',
"log4php.appender.A1" => 'LoggerAppenderEcho',
"log4php.appender.A1.layout" => 'LoggerPatternLayout',
"log4php.appender.A1.layout.ConversionPattern" => '"%d{ISO8601} [%p] %m%n"',
);
require_once("(...)/log4php/LoggerManager.php");
$logger =& LoggerManager::getLogger("test01");
...
こんな感じになります。
LOG4PHP_CONFIGURATOR_CLASSのフォーマットに注意してください!!ファイル名末尾の".php"は不要です!!
というのは、LOG4PHP_CONFIGURATOR_CLASSのbase_name()をクラス名としているため、".php"がついてしまうとまずいわけです。これがひいては、クラス名とファイル名をJava風に一致させる必要につながります。
さらに言うと、この制限により
define('LOG4PHP_CONFIGURATOR_CLASS',
realpath(dirname(__FILE__).'/SampleConfigurator'));
みたく出来ないわけです。クラス名になってしまっているため、realpath()が見つからなくなってしまうからです。
以上のような点に注意して頂ければ、設定ファイルに依らない、柔軟なlog4phpの設定を行うことが可能になります。