Memo/PHP/log4php

https://dexlab.net:443/pukiwiki/index.php?Memo/PHP/log4php
 

log4php - PHP版log4j

概要

  • log4jのPHP版。設定ファイルや機能が近い。表示、ファイル、DB、メール等々様々な出力先やログ形式で出力できて便利

サンプル


各種パッチ

  • filelog4php_php5.patch
  • パッチの適用
    svn export http://svn.apache.org/repos/asf/incubator/log4php/trunk/src/main/php log4php
    patch -p0 < log4php_php5.patch
  • 修正内容
    • php5 r747284 ベース
    • LoggerAppenderSkeleton?のコンストラクタが__construct()に変わっているが、appender側でLoggerAppenderSkeleton?()を呼び出そうとして失敗している箇所の修正
    • LoggerAppenderDb?
      • 文字コード指定プロパティ「encoding」追加
      • メッセージをDB::escapeSimple()でエスケープするように変更。(本当はすべてのパラメータをエスケープしたいのですが、やり方がわからず)
    • XMLではなく、phpの配列で設定できる「log4phpArrayConfigurator?.php」追加
    • メッセージ出力時にファイルを作る「LoggerAppenderDailyFileDynamic?.php」追加

ログレベル

  • 弱い順から
    DEBUG
    INFO
    WARN
    ERROR
    FATAL

例えば、以下のようにすると、INFOレベル以下がログ出力される。つまり、DEBUGレベルは出力されない。
DEBUGを指定すれば、全て出力される。

log4php.rootLogger = INFO, default

サンプル

データベース(sqlite)

  • phpソース
    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");
  • log4php.properties
    ; この構造には、以下のテーブルが必要となります
    ;
    ;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')"

Tips

LoggerAppenderDb? でDBの内部エンコードを指定するには

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を使うには

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.

資料/リンク


添付ファイル: filelog4php_php5.patch 1506件 [詳細] filelog4php_sample.php 1890件 [詳細] fileLoggerAppenderDb.php 1951件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (63d)