TP5ログ記録と異常処理
25986 ワード
ログログログ構成 ログが閉じられている方式 設定ログタイプは です。ログ記録レベル を設定します。
ログレベル log一般ログは、ログ を記録するために使用されます。 errorエラーは、プログラムの終了を招きます。 notice警告、プログラムは実行できますが、まだ完全ではないエラーです。 info情報、プログラム出力情報 デバッグ、デバッグ情報 sql SQL文は、SQLレコードに使用され、データベースのデバッグモードがオープンしたときだけ有効です。
ログを記録するいくつかの方法 Log:write(“message”“info”)は、ログ情報 をリアルタイムに書き込みます。 Log:record(「message」「info」)は、メモリに書き込み、システム要求が終了すると自動的に に書き込みます。 trace(「message」「info」) アプリケーションログ構成がオフの場合:Log:init()は手動記録 を行う。
開発環境では、印刷変数とデバッグによってエラーを発見し、修正することができますが、生産環境で勝手に修正してデバッグすることができないなら、新しいバージョンのシステムが出てくるまで、生産環境のコードを変更することができます。生産環境はログ(最善の方法)を通してエラーを調べることができます。多くの情報がログとして記録されていると、多くの無意味な記録情報が表示され、ハードディスクのメモリ資源が消費されているだけでなく、エラーのチェックにも影響を与えます。TP 5デフォルトではすべてを記録します。設定項目のレベルが設定されていても、手動で閉じる必要があります。ログを記録するために選択があります。カスタムグローバルログ デバッグモードを開く 変数デバッグ dump halt パフォーマンスデバッグ
開発過程では、性能をテストするために、あるコードの運転時間やメモリを調整する必要があります。 は を使用する。ヘルパー関数 を使用する。 sqlデバッグの3つの方法 ログ方式 SQL を傍受する。 get LastSqlまたはfetchecl 異常を投げる
異常の分類は、クライアントの挙動による異常とサーバ自身の異常に分けることができる。クライアントの動作に起因する異常は、通常ログを記録する必要がなく、クライアントに特定の情報を返す必要がある。例えば、検証器を通していないと、結果サーバ自体の異常が確認されません。通常はログを記録する必要があります。クライアントに具体的なエラー情報を返す必要がありません。帰っても、クライアントが読めないかもしれません。コードが抽象的であればあるほど、多重性が高い。パッケージ性が良いほど、コードの変化に適応する能力が強くなります。カスタム公共異常クラス カスタム共通異常サブクラス カスタム異常処理クラス
application/config.php
'log' => [
// , file socket
'type' => 'File',
//
'path' => LOG_PATH,
//
'level' => ['error','notice','debug','sql'],
],
test
開発環境では、印刷変数とデバッグによってエラーを発見し、修正することができますが、生産環境で勝手に修正してデバッグすることができないなら、新しいバージョンのシステムが出てくるまで、生産環境のコードを変更することができます。生産環境はログ(最善の方法)を通してエラーを調べることができます。多くの情報がログとして記録されていると、多くの無意味な記録情報が表示され、ハードディスクのメモリ資源が消費されているだけでなく、エラーのチェックにも影響を与えます。TP 5デフォルトではすべてを記録します。設定項目のレベルが設定されていても、手動で閉じる必要があります。ログを記録するために選択があります。
// ,
\think\Log::init([
'type' => 'File',
'path' => LOG_PATH,
'level' => ['error']
]);
//
Log::record('message','error');
// write , , ,
エラーとデバッグapp_debug = true
開発過程では、性能をテストするために、あるコードの運転時間やメモリを調整する必要があります。
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';
異常の分類は、クライアントの挙動による異常とサーバ自身の異常に分けることができる。クライアントの動作に起因する異常は、通常ログを記録する必要がなく、クライアントに特定の情報を返す必要がある。例えば、検証器を通していないと、結果サーバ自体の異常が確認されません。通常はログを記録する必要があります。クライアントに具体的なエラー情報を返す必要がありません。帰っても、クライアントが読めないかもしれません。コードが抽象的であればあるほど、多重性が高い。パッケージ性が良いほど、コードの変化に適応する能力が強くなります。
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');
}
}