#navi_header|PHP| 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を使うには log4phpのバージョン0.9のお話です。 log4phpは、基本は設定ファイルを用意してそれを"LOG4PHP_CONFIGURATION"で指定して使います。そのため、「動的に設定を取得したい(例えばDBからlog4phpの設定を動的に作りたい)場合はどうするの?」となります。 対処の一例が今回ので、 '' LOG4PHP_CONFIGURATOR_CLASS '' を利用して、ファイルを使わない自作の設定クラスを指定します。 話を早くするために、とりあえずサンプルです。$logger_propertiesという連想配列を設定として用いるSampleConfiguratorというクラスを作りました。 [SampleConfigurator.php] // クラス名.phpという形式にする必要があります。 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の設定を行うことが可能になります。 #navi_footer|PHP|