トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP4:ログ共通処理クラスの検討

[カテゴリ:Linux]

特徴

  • 以下エラーをハンドリングする。
    • PHPが生成するエラー
    • PEARが生成するエラー
  • バックトレースも出力する。
    • ネストされた関数、メソッドCallも追跡できる。
    • PEAR::Var_Dumpを使って見やすく整形
  • 画面には最低限のメッセージのみ表示する。
    • セキュリティ対策?
  • syslogにも出力する。

ソース

HLog.php

<?php
require_once('Var_Dump.php');
$_HLog_errlog_path = null;
class HLog {
    function init($ident = false, $option = LOG_ODELAY, $facility = LOG_LOCAL0, $errlog_path = './errlog/') {
        global $_HLog_errlog_path;
        $_HLog_errlog_path = $errlog_path;
        set_error_handler('_HLog_errorCallbackPhp');
        PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, '_HLog_errorCallbackPear');
        openlog($ident, $option, $facility);
    }
    // アクションを直ちにおこす必要がある
    function alert($msg, $err_obj = null) {
        $msg = 'ALERT: ' . $msg;
        syslog(LOG_ALERT, $msg);
        HLog::_doNotify($msg, $err_obj);
        echo 'システムエラーが発生しました<br>';
        echo htmlspecialchars($msg);
        exit(0);
    }
    // 致命的な条件
    function crit($msg, $err_obj = null) {
        $msg = 'CRIT: ' . $msg;
        syslog(LOG_CRIT, $msg);
        HLog::_doNotify($msg, $err_obj);
        echo 'システムエラーが発生しました<br>';
        echo htmlspecialchars($msg);
        exit(0);
    }
    // エラーを発生する条件
    function err($msg, $err_obj = null) {
        $msg = 'ERR: ' . $msg;
        syslog(LOG_ERR, $msg);
        HLog::_doNotify($msg, $err_obj);
        echo 'システムエラーが発生しました<br>';
        echo htmlspecialchars($msg);
        exit(0);
    }
    // 警告を発生する条件
    function warn($msg) {
        $msg = 'WARN: ' . $msg;
        syslog(LOG_WARNING, $msg);
    }
    // 通常の動作だが、特徴的な条件
    function notice($msg) {
        $msg = 'NOTICE: ' . $msg;
        syslog(LOG_NOTICE, $msg);
    }

    // 情報を与えるメッセージ
    function info($msg) {
        $msg = 'INFO: ' . $msg;
        syslog(LOG_INFO, $msg);
    }

    // デバッグ用のメッセージ
    function debug($msg) {
        $msg = 'DEBUG: ' . $msg;
        syslog(LOG_DEBUG, $msg);
    }

    function _doNotify($msg, $err_obj) {
        if (empty($err_obj)) {
            $dbg = debug_backtrace();
        }
        else {
            $dbg = $err_obj->getBacktrace();
        }
        $dbg['environment'] = $_SERVER;
        HLog::_varDumpToFile($msg, $dbg);
    }

    function _varDumpToFile($msg, $obj) {
        global $_HLog_errlog_path;
        $vardump = Var_Dump::factory(array('display_mode' => 'HTML4_Table'));
        $wk = $vardump->toString($obj);
        $filename = $_HLog_errlog_path . date('YmdHis') . '.htm';
        $h = fopen($filename, "w");
        fputs($h, $msg);
        fputs($h, $wk);
        fclose($h);
    }
}

function _HLog_errorCallbackPhp($errno, $errstr, $errfile, $errline) {
    switch ($errno) {
    case E_NOTICE:
    case E_USER_NOTICE:
    case E_USER_WARNING:
        return;
    }
    if (error_reporting() != 0) {
        $msg = 'PHP system error occured';
        $msg .= " errno=$errno str=$errstr file=$errfile line=$errline";
        $msg = 'CRIT: ' . $msg;
        syslog(LOG_CRIT, $msg);
        HLog::_doNotify($msg, null);
        echo 'システムエラー(php例外)が発生しました<br>';
        echo htmlspecialchars($msg);
        exit(0);
    }
}

function _HLog_errorCallbackPear($err_obj) {
    $msg = 'PHP system error occured';
    $msg .= " " . $err_obj->getMessage();
    $msg = 'CRIT: ' . $msg;
    syslog(LOG_CRIT, $msg);
    HLog::_doNotify($msg, $err_obj);
    echo 'システムエラー(pear例外)が発生しました<br>';
    echo htmlspecialchars($msg);
    exit(0);
}
?>

使用例

<?php
require_once('HLog.php');
require_once('DB.php');

define('D_HLOG_IDENT',                  'phpapp');
define('D_HLOG_OPTION',                 LOG_ODELAY);
define('D_HLOG_FACILITY',               LOG_LOCAL0);
define('D_HLOG_ERRLOG_PATH',            D_BASE_PATH . '/errlog/');

// ログ環境初期化
HLog::init(D_HLOG_IDENT, D_HLOG_OPTION, D_HLOG_FACILITY, D_HLOG_ERRLOG_PATH);
// 
$tmp = array(
    'key1' => 'あいうえお',
    'key2' => 'かきくけこ',
);
// ログ出力
HLog::debug('--- start!!');
HLog::info('--- start!!');
HLog::notice('--- start!!');
HLog::warn('--- start!!');
HLog::err('err!!');
//HLog::crit('err!!');
//HLog::alart('err!!');
// php例外
//fopen("hogehoge", "r");

// pear例外
//$db = DB::connect(D_DSN);
?>

最終更新時間:2006年01月09日 16時26分57秒