TP5ログ記録と異常処理


ログログ
  • ログ構成application/config.php
  •     'log' => [
            //       ,   file socket     
            'type'  => 'File',
            //       
            'path'  => LOG_PATH,
            //       
            'level' => ['error','notice','debug','sql'],
        ],
    
  • ログが閉じられている方式
  • 設定ログタイプはtest
  • です。
  • ログ記録レベル
  • を設定します。
  • ログレベル
  • log一般ログは、ログ
  • を記録するために使用されます。
  • errorエラーは、プログラムの終了を招きます。
  • notice警告、プログラムは実行できますが、まだ完全ではないエラーです。
  • info情報、プログラム出力情報
  • デバッグ、デバッグ情報
  • sql SQL文は、SQLレコードに使用され、データベースのデバッグモードがオープンしたときだけ有効です。
  • ログを記録するいくつかの方法
  • Log:write(“message”“info”)は、ログ情報
  • をリアルタイムに書き込みます。
  • Log:record(「message」「info」)は、メモリに書き込み、システム要求が終了すると自動的に
  • に書き込みます。
  • trace(「message」「info」)
  • アプリケーションログ構成がオフの場合:Log:init()は手動記録
  • を行う。
    開発環境では、印刷変数とデバッグによってエラーを発見し、修正することができますが、生産環境で勝手に修正してデバッグすることができないなら、新しいバージョンのシステムが出てくるまで、生産環境のコードを変更することができます。生産環境はログ(最善の方法)を通してエラーを調べることができます。多くの情報がログとして記録されていると、多くの無意味な記録情報が表示され、ハードディスクのメモリ資源が消費されているだけでなく、エラーのチェックにも影響を与えます。TP 5デフォルトではすべてを記録します。設定項目のレベルが設定されていても、手動で閉じる必要があります。ログを記録するために選択があります。
  • カスタムグローバルログ
  •    //            ,                
       \think\Log::init([
           'type'  =>  'File',
           'path'  =>  LOG_PATH,
           'level' => ['error']
       ]);
       //                  
       Log::record('message','error');
       //      write  ,          ,        ,     
    
    エラーとデバッグ
  • デバッグモードを開くapp_debug = true
  • 変数デバッグ
  • dump
  • halt
  • パフォーマンスデバッグ
    開発過程では、性能をテストするために、あるコードの運転時間やメモリを調整する必要があります。
  • Debug
  • を使用する。
     Debug::remark('begin');
     // ...     
     Debug::remark('end');
     // ...          
     //       
     echo Debug::getRangeTime('begin','end').'s';
    
  • ヘルパー関数debug
  • を使用する。
     debug('begin');
     // ...     
     debug('end');
     // ...          
     //       
     echo debug('begin','end').'s';
     echo debug('begin','end',6).'s';
     echo debug('begin','end','m').'kb';
    
  • sqlデバッグの3つの方法
  • ログ方式
  • SQL
  • を傍受する。
  • get LastSqlまたはfetchecl
  • 異常を投げる
    異常の分類は、クライアントの挙動による異常とサーバ自身の異常に分けることができる。クライアントの動作に起因する異常は、通常ログを記録する必要がなく、クライアントに特定の情報を返す必要がある。例えば、検証器を通していないと、結果サーバ自体の異常が確認されません。通常はログを記録する必要があります。クライアントに具体的なエラー情報を返す必要がありません。帰っても、クライアントが読めないかもしれません。コードが抽象的であればあるほど、多重性が高い。パッケージ性が良いほど、コードの変化に適応する能力が強くなります。
  • カスタム公共異常クラス
        namespace app\lib\exception;
        
        use think\Exception;
        
        class BaseException extends Exception
        {
            public $code = 400;
            public $msg  = 'invalid parameters';
            public $errorCode  = '999';
        
            public $shouldToClient = true;
        
            public function __construct($params = [])
            {
                if( ! is_array($params)) return;
        
                if( array_key_exists('code',$params) )
                    $this->code = $params['code'];
        
                if( array_key_exists('msg',$params) )
                    $this->msg = $params['msg'];
        
                if( array_key_exists('errorCode',$params) )
                    $this->errorCode = $params['errorCode'];
            }
        }
    
  • カスタム共通異常サブクラス
        namespace app\lib\exception;
        
        class MissException extends BaseException
        {
            public $code = 404;
            public $msg = 'global:your required resource are not found';
            public $errorCode = 10001;
        }
    
  • カスタム異常処理クラス
  •    namespace app\lib\exception;
       
       use Exception;
       use think\exception\Handle;
       use think\Log;
       use think\Request;
       
       class ExceptionHandler extends Handle
       {
           private $code;
           private $msg;
           private $errorCode;
       
           public function render(Exception $e)
           {
               //        ,   http   ,       
               //                              
               //       
               if( $e instanceof BaseException ){
                   $this->code      = $e->code;
                   $this->msg       = $e->msg;
                   $this->errorCode = $e->errorCode;
               }else{
                   //             , http      500,     
       
                   //          TP       ,  TP     
                   //        
                   if( config('app_debug') ){
                       return parent::render($e);
                   }
       
                   $this->code = 500;
                   $this->msg = 'sorry,we make a mistake. (^o^)Y';
                   $this->errorCode = 999;
                   $this->recordErrorLog($e);
               }
       
               $request = Request::instance();
               $result = [
                   'msg'  => $this->msg,
                   'error_code' => $this->errorCode,
                   'request_url' => $request = $request->url()
               ];
               return json($result, $this->code);
           }
       
           /**
            *       
            * @param Exception $e
            */
           private function recordErrorLog(Exception $e)
           {
               Log::init([
                   'type'  =>  'File',
                   'path'  =>  LOG_PATH,
                   'level' => ['error']
               ]);
               Log::record($e->getMessage(),'error');
           }
       }