Ignore:
Timestamp:
2012/03/04 04:20:00 (12 years ago)
Author:
Seasoft
Message:

#1633 (エラーハンドリングの改善)
#1676 (ログファイルを分離する)
#1677 (デバッグログの出力設定と画面へのエラー出力設定とを分離する)
#1678 (SQL の実行ログを提供する)
#1613 (typo修正・ソース整形・ソースコメントの改善)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_12-dev/data/class/util/GC_Utils.php

    r21579 r21582  
    2525 * 各種ユーティリティクラス. 
    2626 * 
     27 * このクラスはエラーハンドリング処理でも使用している。 
     28 * よって、このファイルで構文エラーが発生すると、EC-CUBE はエラーを捕捉できない。 
    2729 * @package Util 
    2830 * @author LOCKON CO.,LTD. 
     
    3840     */ 
    3941    function gfDebugLog($obj) { 
    40         if (DEBUG_MODE === true) { 
    41             GC_Utils_Ex::gfPrintLog( 
    42                 "*** start Debug ***\n" . 
    43                 print_r($obj, true) . 
    44                 '*** end Debug ***' 
    45             ); 
     42        if (USE_VERBOSE_LOG === true) { 
     43            $msg = "DEBUG\n" 
     44                 . print_r($obj, true); 
     45            GC_Utils_Ex::gfPrintLog($msg, DEBUG_LOG_REALFILE); 
    4646        } 
    4747    } 
     
    5353     * @return string 呼び出し元クラス、関数名、行数の文字列表現 
    5454     */ 
    55     function gfGetCallerInfo($forLogInfo=true) { 
     55    function gfGetCallerInfo($forLogInfo = true) { 
    5656        // バックトレースを取得する 
    5757        $traces = debug_backtrace(false); 
     
    5959        if ($forLogInfo === true) { 
    6060            $bklv = 3; 
    61             if( ($traces[3]['class'] === 'LC_Page' 
    62                 || $traces[3]['class'] === 'LC_Page_Admin') 
    63                 && $traces[3]['function'] === 'log') 
    64             { 
     61            if (($traces[3]['class'] === 'LC_Page' || $traces[3]['class'] === 'LC_Page_Admin') 
     62                && $traces[3]['function'] === 'log' 
     63            ) { 
    6564                $bklv = 4; 
    6665            } 
    6766        } 
    68         $str = $traces[$bklv]['class'] . '::' . $traces[$bklv]['function'] . '(' . $traces[$bklv-1]['line'] . ') '; 
     67        $str = $traces[$bklv]['class'] . '::' . $traces[$bklv]['function'] . '(' . $traces[$bklv - 1]['line'] . ') '; 
    6968        return $str; 
    7069    } 
    7170 
    7271    /** 
    73      * ログメッセージに、呼び出し元関数名等の情報を付加して返します 
    74      * 
    75      * @param string $mess ログメッセージ 
    76      * @param string $log_level ログレベル('Info' or 'Debug') 
    77      * @return string ログメッセージに呼び出し元関数名等の情報を付加した文字列 
    78      */ 
    79     function gfGetLogStr($mess, $log_level='Info') { 
     72     * デバッグ情報として必要な範囲のバックトレースを取得する 
     73     * 
     74     * エラーハンドリングに関わる情報を切り捨てる。 
     75     */ 
     76    function getDebugBacktrace($arrBacktrace = null) { 
     77        if (is_null($arrBacktrace)) { 
     78            $arrBacktrace = debug_backtrace(false); 
     79        } 
     80        $arrReturn = array(); 
     81        foreach (array_reverse($arrBacktrace) as $arrLine) { 
     82            // 言語レベルの致命的エラー時。発生元の情報はトレースできない。(エラーハンドリング処理のみがトレースされる) 
     83            // 実質的に何も返さない(空配列を返す)意図。 
     84            if (strlen($arrLine['file']) === 0 
     85                && ($arrLine['class'] === 'SC_Helper_HandleError' || $arrLine['class'] === 'SC_Helper_HandleError_Ex') 
     86                && ($arrLine['function'] === 'handle_error' || $arrLine['function'] === 'handle_warning') 
     87            ) { 
     88                break 1; 
     89            } 
     90 
     91            $arrReturn[] = $arrLine; 
     92 
     93            // エラーハンドリング処理に引き渡した以降の情報は通常不要なので含めない。 
     94            if (!isset($arrLine['class']) && $arrLine['function'] === 'trigger_error') { 
     95                break 1; 
     96            } 
     97            if (($arrLine['class'] === 'SC_Helper_HandleError' || $arrLine['class'] === 'SC_Helper_HandleError_Ex') 
     98                && ($arrLine['function'] === 'handle_error' || $arrLine['function'] === 'handle_warning') 
     99            ) { 
     100                break 1; 
     101            } 
     102            if (($arrLine['class'] === 'SC_Utils' || $arrLine['class'] === 'SC_Utils_Ex') 
     103                && $arrLine['function'] === 'sfDispException' 
     104            ) { 
     105                break 1; 
     106            } 
     107            if (($arrLine['class'] === 'GC_Utils' || $arrLine['class'] === 'GC_Utils_Ex') 
     108                && $arrLine['function'] === 'gfDebugLog' 
     109            ) { 
     110                break 1; 
     111            } 
     112        } 
     113        return array_reverse($arrReturn); 
     114    } 
     115 
     116    /** 
     117     * 前方互換用 
     118     * 
     119     * @deprecated 2.12.0 
     120     */ 
     121    function gfGetLogStr($mess, $log_level = 'Info') { 
     122        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING); 
    80123        // メッセージの前に、ログ出力元関数名とログ出力関数呼び出し部分の行数を付与 
    81124        $mess = GC_Utils::gfGetCallerInfo(true) . $mess; 
     
    90133 
    91134    /** 
    92      * 管理画面用ログ出力 
    93      * 
    94      * 管理画面用ログ出力を行ないます 
    95      * @param string $mess ログメッセージ 
    96      * @param string $log_level ログレベル('Info' or 'Debug') 
    97      * @return void 
    98      */ 
    99     function gfAdminLog($mess, $log_level='Info') { 
     135     * 前方互換用 
     136     * 
     137     * @deprecated 2.12.0 GC_Utils_Ex::gfPrintLog を使用すること 
     138     */ 
     139    function gfAdminLog($mess, $log_level = 'Info') { 
     140        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING); 
    100141        // ログレベル=Debugの場合は、DEBUG_MODEがtrueの場合のみログ出力する 
    101         if ($log_level === 'Debug'&& DEBUG_MODE === false) { 
     142        if ($log_level === 'Debug' && DEBUG_MODE === false) { 
    102143            return; 
    103144        } 
    104145 
    105         // ログメッセージに、呼び出し元関数名等の情報を付加する 
    106         $mess = GC_Utils::gfGetLogStr($mess, $log_level); 
    107  
    108146        // ログ出力 
    109         // ※現在は管理画面用・フロント用のログ出力とも、同じファイル(site.log)に出力します。 
    110         //  分けたい場合は、以下の関数呼び出しの第2引数にファイルパスを指定してください 
    111         GC_Utils_Ex::gfPrintLog($mess); 
    112     } 
    113  
    114     /** 
    115      * フロント用ログ出力 
    116      * 
    117      * フロント用ログ出力を行ないます 
    118      * @param string $mess ログメッセージ 
    119      * @param string $log_level ログレベル('Info' or 'Debug') 
    120      * @return void 
    121      */ 
    122     function gfFrontLog($mess, $log_level='Info') { 
     147        GC_Utils_Ex::gfPrintLog($mess, '', true); 
     148    } 
     149 
     150    /** 
     151     * 前方互換用 
     152     * 
     153     * @deprecated 2.12.0 GC_Utils_Ex::gfPrintLog を使用すること 
     154     */ 
     155    function gfFrontLog($mess, $log_level = 'Info') { 
     156        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING); 
    123157        // ログレベル=Debugの場合は、DEBUG_MODEがtrueの場合のみログ出力する 
    124         if ($log_level === 'Debug'&& DEBUG_MODE === false) { 
     158        if ($log_level === 'Debug' && DEBUG_MODE === false) { 
    125159            return; 
    126160        } 
    127161 
    128         // ログメッセージに、呼び出し元関数名等の情報を付加する 
    129         $mess = GC_Utils::gfGetLogStr($mess, $log_level); 
    130  
    131162        // ログ出力 
    132         // ※現在は管理画面用・フロント用のログ出力とも、同じファイル(site.log)に出力します。 
    133         //  分けたい場合は、以下の関数呼び出しの第2引数にファイルパスを指定してください 
    134         GC_Utils_Ex::gfPrintLog($mess); 
    135     } 
    136  
    137     /*---------------------------------------------------------------------- 
    138      * [名称] gfPrintLog 
    139      * [概要] ログファイルに日時、処理ファイル名、メッセージを出力 
    140      * [引数] 表示したいメッセージ 
    141      * [戻値] なし 
    142      * [依存] なし 
    143      * [注釈] - 
    144      *----------------------------------------------------------------------*/ 
    145     function gfPrintLog($mess, $path = '') { 
     163        GC_Utils_Ex::gfPrintLog($mess, '', true); 
     164    } 
     165 
     166    /** 
     167     * ログの出力を行う 
     168     * 
     169     * エラー・警告は trigger_error() を経由して利用すること。(補足の出力は例外。) 
     170     * @param string $msg 
     171     * @param string $path 
     172     * @param bool $verbose 冗長な出力を行うか 
     173     */ 
     174    function gfPrintLog($msg, $path = '', $verbose = USE_VERBOSE_LOG) { 
    146175        // 日付の取得 
    147176        $today = date('Y/m/d H:i:s'); 
    148177        // 出力パスの作成 
    149         if ($path == '') { 
    150             $path = LOG_REALFILE; 
    151         } 
    152  
    153         // エスケープされている文字をもとに戻す 
    154         $trans_tbl = get_html_translation_table (HTML_ENTITIES); 
    155         $trans_tbl = array_flip ($trans_tbl); 
    156         $mess = strtr($mess, $trans_tbl); 
    157  
    158         $fp = fopen($path, 'a+'); 
    159         if ($fp) { 
    160             $string = "$today [{$_SERVER['PHP_SELF']}] $mess from {$_SERVER['REMOTE_ADDR']}\n"; 
    161             fwrite($fp, $string); 
    162             fclose($fp); 
    163         } 
     178 
     179        if (strlen($path) === 0) { 
     180            $path = GC_Utils_Ex::isAdminFunction() ? ADMIN_LOG_REALFILE : LOG_REALFILE; 
     181        } 
     182 
     183        $msg = "$today [{$_SERVER['PHP_SELF']}] $msg from {$_SERVER['REMOTE_ADDR']}\n"; 
     184        if ($verbose) { 
     185            if (GC_Utils_Ex::isFrontFunction()) { 
     186                $msg .= 'customer_id = ' . $_SESSION['customer']['customer_id'] . "\n"; 
     187            } 
     188            if (GC_Utils_Ex::isAdminFunction()) { 
     189                $msg .= 'login_id = ' . $_SESSION['login_id'] . '(' . $_SESSION['authority'] . ')' . '[' . session_id() . ']' . "\n"; 
     190            } 
     191            $msg .= GC_Utils_Ex::toStringBacktrace(GC_Utils_Ex::getDebugBacktrace()); 
     192        } 
     193 
     194        error_log($msg, 3, $path); 
    164195 
    165196        // ログテーション 
     
    253284        return implode(', ', $mailaddrs); //複数アドレスはカンマ区切りにする 
    254285    } 
     286 
     287    /** 
     288     * バックトレースをテキスト形式で出力する 
     289     * 
     290     * 現状スタックトレースの形で出力している。 
     291     * @param array $arrBacktrace バックトレース 
     292     * @return string テキストで表現したバックトレース 
     293     */ 
     294    function toStringBacktrace($arrBacktrace) { 
     295        $string = ''; 
     296 
     297        foreach (array_reverse($arrBacktrace) as $backtrace) { 
     298            if (strlen($backtrace['class']) >= 1) { 
     299                $func = $backtrace['class'] . $backtrace['type'] . $backtrace['function']; 
     300            } else { 
     301                $func = $backtrace['function']; 
     302            } 
     303 
     304            $string .= $backtrace['file'] . '(' . $backtrace['line'] . '): ' . $func . "\n"; 
     305        } 
     306 
     307        return $string; 
     308    } 
     309 
     310    /** 
     311     * エラー型から該当する定数名を取得する 
     312     * 
     313     * 該当する定数がない場合、$error_type を返す。 
     314     * @param integer $error_type エラー型 
     315     * @return string|integer エラー定数名 
     316     */ 
     317    function getErrorTypeName($error_type) { 
     318        $arrDefinedConstants = get_defined_constants(true); 
     319 
     320        // PHP の歴史対応 
     321        $arrDefinedCoreConstants = array(); 
     322        // PHP >= 5.3.1, PHP == 5.3.0 (not Windows) 
     323        if (isset($arrDefinedConstants['Core'])) { 
     324            $arrDefinedCoreConstants = $arrDefinedConstants['Core']; 
     325        } 
     326        // PHP < 5.3.0 
     327        elseif (isset($arrDefinedConstants['internal'])) { 
     328            $arrDefinedCoreConstants = $arrDefinedConstants['internal']; 
     329        } 
     330        // PHP == 5.3.0 (Windows) 
     331        elseif (isset($arrDefinedConstants['mhash'])) { 
     332            $arrDefinedCoreConstants = $arrDefinedConstants['mhash']; 
     333        } 
     334 
     335        foreach ($arrDefinedCoreConstants as $constant_name => $constant_value) { 
     336            if (substr($constant_name, 0, 2) === 'E_' && $constant_value == $error_type) { 
     337                return $constant_name; 
     338            } 
     339        } 
     340        return $error_type; 
     341    } 
     342 
     343    /** 
     344     * 現在の URL を取得する 
     345     * 
     346     * @return string 現在のURL 
     347     */ 
     348    function getUrl() { 
     349        $url = ''; 
     350 
     351        if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { 
     352            $url = 'https://'; 
     353        } else { 
     354            $url = 'http://'; 
     355        } 
     356 
     357        $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
     358        if (strlen($_SERVER['QUERY_STRING']) >= 1) { 
     359            $url .= '?' . $_SERVER['QUERY_STRING']; 
     360        } 
     361 
     362        return $url; 
     363    } 
     364 
     365    /** 
     366     * 管理機能かを判定 
     367     * 
     368     * @return bool 管理機能か 
     369     */ 
     370    function isAdminFunction() { 
     371        return defined('ADMIN_FUNCTION') && ADMIN_FUNCTION === true; 
     372    } 
     373 
     374    /** 
     375     * フロント機能かを判定 
     376     * 
     377     * @return bool フロント機能か 
     378     */ 
     379    function isFrontFunction() { 
     380        return defined('FRONT_FUNCTION') && FRONT_FUNCTION === true; 
     381    } 
     382 
     383    /** 
     384     * インストール機能かを判定 
     385     * 
     386     * @return bool インストール機能か 
     387     */ 
     388    function isInstallFunction() { 
     389        return defined('INSTALL_FUNCTION') && INSTALL_FUNCTION === true; 
     390    } 
    255391} 
Note: See TracChangeset for help on using the changeset viewer.