svn export http://svn.apache.org/repos/asf/incubator/log4php/trunk/src/main/php log4php
svn export http://svn.apache.org/repos/asf/incubator/log4php/trunk/src/main/php log4php patch -p0 < log4php_php5.patch
DEBUG INFO WARN ERROR FATAL
例えば、以下のようにすると、INFOレベル以下がログ出力される。つまり、DEBUGレベルは出力されない。
DEBUGを指定すれば、全て出力される。
log4php.rootLogger = INFO, default
require_once('log4php/LoggerManager.php'); LoggerMDC::put('username', $_SERVER['REMOTE_USER']); LoggerMDC::put('ip_address', $_SERVER['REMOTE_ADDR']); LoggerMDC::put('uri', $_SERVER['REQUEST_URI']); $logger =& LoggerManager::getRootLogger(); $logger->info("Testing MDC");
; この構造には、以下のテーブルが必要となります ; ;CREATE TABLE log4php ( ; timestamp varchar(32) default NULL, ; logger varchar(32) default NULL, ; username int(11) default NULL, ; ip_address varchar(15) default NULL, ; uri varchar(255) default NULL, ; level varchar(32) default NULL, ; message varchar(64) default NULL, ; thread varchar(32) default NULL, ; file varchar(64) default NULL, ; line varchar(4) default NULL ;); ; log4php.debug = false log4php.rootLogger = INFO, sqlite log4php.appender.default = LoggerAppenderEcho log4php.appender.default.layout = LoggerLayoutSimple log4php.appender.sqlite = LoggerAppenderDb log4php.appender.sqlite.dsn = "sqlite:////path/to/data.db?mode=0666" log4php.appender.sqlite.createTable = false log4php.appender.sqlite.table = log4php log4php.appender.sqlite.sql = "INSERT INTO log4php (timestamp, logger, username, ip_address, uri, level, message, thread, file, line) VALUES ('%d{Y-m-d H:i:s}','%c', '%X{username}','%X{ip_address}', '%X{uri}','%p','%m','%t','%F','%L')"
phpソースがeuc-jpで、DBがUTF-8だった場合、log4phpはPEAR::DBを使用するので、文字コードの自動変換をしてくれません。よって、文字化けしてしまします。
以下の改変で、オプションにencodingを追加し、データベース登録前に変換するようにします。
define('LOG4PHP_CONFIGURATOR_CLASS', ROOT_DIR.'lib/log4phpArrayConfigurator'); $g_logger_properties = array( 'log4php.debug' => 'false', 'log4php.rootLogger' => 'DEBUG, db', 'log4php.appender.default' => 'LoggerAppenderEcho', 'log4php.appender.default.layout' => 'LoggerLayoutSimple', 'log4php.appender.db' => 'LoggerAppenderDb', 'log4php.appender.db.dsn' => sprintf("pgsql://%s:%s@%s/%s", DATABASE_ID, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_NAME), 'log4php.appender.db.createTable' => 'false', 'log4php.appender.db.table' => 'SYSLOG', 'log4php.appender.db.sql' => "INSERT INTO SYSLOG (syslog_code, add_date, logger, username, ip_address, uri, loglevel, message, thread, file, line) VALUES (nextval('SYSLOG_SYSLOG_CODE_SEQ'), '%d{Y-m-d H:i:s}','%c', '%X{username}','%X{ip_address}', '%X{uri}','%p','%m','%t','%F','%L')", 'log4php.appender.db.encoding' => 'UTF-8', );
log4phpのバージョン0.9のお話です。
Tipsに入っちゃうかも知れない。
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の設定を行うことが可能になります。
とりあえず以上。
%c カテゴリー %C クラス名 %d ログイベントの日付(PHP のdate() 関数の書式で記述する) %F ファイル名 %l 位置情報(% F と% L) %L 行番号 %m メッセージ %M 関数名 %n プラットフォーム依存の改行(\n や\r\n など) %p ログイベントの重要度 %r 実行からログイベント発生時までの経過秒数(ミリ秒単位) %t スレッド(プロセスID) %x スレッドに関連づけられたNDC %X スレッドに関連づけられたMDC * Format modifier left justify minimum width maximum width comment * %20c false 20 none Left pad with spaces if the category name * is less than 20 characters long. * %-20c true 20 none Right pad with spaces if the category name * is less than 20 characters long. * %.30c NA none 30 Truncate from the beginning if the category name * is longer than 30 characters. * %20.30c false 20 30 Left pad with spaces if the category name * is shorter than 20 characters. * However, if category name is longer than 30 chars, * then truncate from the beginning. * %-20.30c true 20 30 Right pad with spaces if the category name is * shorter than 20 chars. * However, if category name is longer than 30 chars, * then truncate from the beginning.