Laravel 5.3学習ノートのエラー&ログ

5352 ワード

1、紹介
Laravelのデフォルトでは、AppExceptionsHandlerクラスで例外をトリガーし、応答をユーザーに返します.このチュートリアルでは、このクラスについて深く検討します.
また、LaravelにはMonologログライブラリが統合されており、さまざまな強力なログ・プロセッサを提供しています.デフォルトでは、Laravelはいくつかのプロセッサを構成しています.単一のログ・ファイルを選択したり、システム・ログにエラー情報を記録したりすることができます.
2、配置
エラー詳細表示
プロファイルconfig/app.phpのdebug構成項目は、ブラウザに表示されるエラーの詳細数を制御します.デフォルトでは、この構成項目は通過する.Envファイルの環境変数APP_DEBUGで設定します.
ローカル開発では、環境変数APPを設定する必要があります.DEBUG値はtrueです.本番環境では、この値をfalseに設定する必要があります.本番環境でtrueに設定すると、ターミナルユーザーに敏感な構成値が露出する可能性があります.
ログストレージ
デフォルトでは、Laravelはログメソッドsingle、daily、syslog、errorlogをサポートします.単一のファイルではなく日単位でログファイルを生成したい場合は、プロファイルconfig/appで作成する必要があります.phpでlog値を設定すると、次のようになります.'log' => 'daily'
ログ・ファイルの最大ライフサイクル
Dailyログ・モードを使用する場合、Laravelのデフォルトでは、最近の5日間のログを保持します.この時間を変更するには、構成logを追加する必要があります.max_filesからappプロファイル:'log_max_files' => 30
ログ・エラー・レベル
Monologを使用する場合、ログ・メッセージには異なるエラー・レベルがある可能性があります.デフォルトでは、Laravelはすべてのログをstorageディレクトリに書きますが、本番環境では、プロファイルappを使用して最小限のエラー・レベルを構成することができます.phpにコンフィギュレーション項目logを追加するレベルで実現します.
この構成アイテムが構成されると、Laravelはすべてのエラー・レベルがこの指定レベル以上のログを記録します.たとえば、デフォルトのlog_levelがerrorの場合、error、critical、alert、emergencyレベルのログ情報が記録されます.'log_level' => env('APP_LOG_LEVEL', 'error'),
注意:Monologでは、debug、info、notice、warning、error、critical、alert、emergencyというエラー・レベルがサポートされています.カスタムMonolog構成
アプリケーションでMonologの構成を完全に制御するには、configureMonologUsingメソッドを使用します.bootstrap/appが必要ですphpファイルが$app変数を返す前に、このメソッドを呼び出します.

$app->configureMonologUsing(function($monolog) {
  $monolog->pushHandler(...);
});

return $app;


3、異常処理装置
すべての例外は、reportとrenderの2つのメソッドを含むクラスAppExceptionsHandlerによって処理されます.次に、この2つの方法について詳しく説明します.
Reportメソッド
Reportメソッドは、異常を記録し、BugsnagやSentryなどの外部サービスに送信するために使用されます.デフォルトでは、Reportメソッドは異常が記録されたベースクラスに異常を渡すだけです.もちろん、必要に応じて異常を記録し、関連処理を行うこともできます.
たとえば、異なるタイプの例外を異なる方法で報告する必要がある場合は、PHPのinstanceof比較オペレータを使用します.

/**
 *        
 *
 * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
 *
 * @param \Exception $e
 * @return void
 */
public function report(Exception $e){
  if ($e instanceof CustomException) {
    //
  }

  return parent::report($e);
}


タイプによる例外の無視
例外プロセッサの$dontReportプロパティには、記録されない例外タイプ配列が含まれています.デフォルトでは、404エラー例外はログファイルに書き込まれません.必要に応じて、この配列に他の例外タイプを追加できます.

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
  \Illuminate\Auth\AuthenticationException::class,
  \Illuminate\Auth\Access\AuthorizationException::class,
  \Symfony\Component\HttpKernel\Exception\HttpException::class,
  \Illuminate\Database\Eloquent\ModelNotFoundException::class,
  \Illuminate\Validation\ValidationException::class,
];

renderメソッド
renderメソッドは、指定された例外をブラウザに送信するHTTP応答に変換し、デフォルトでは、応答を生成するベースクラスに例外が渡されます.もちろん、必要に応じて例外タイプをチェックしたり、カスタムレスポンスを返したりすることもできます.

/**
 *       HTTP   
 *
 * @param \Illuminate\Http\Request $request
 * @param \Exception $e
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $e){
  if ($e instanceof CustomException) {
    return response()->view('errors.custom', [], 500);
  }

  return parent::render($request, $e);
}


4、HTTP異常
サーバからのHTTPエラーコードには、例えば、「ページが見つからない」エラー(404)、「認証失敗エラー」(401)、またはプログラムエラーによる500エラーが記載されている異常があり、アプリケーションでこのような応答を生成するためにabortメソッドを使用することができる.
abort(404);
abortメソッドは、例外プロセッサによってレンダリングされる例外をすぐに開始します.また、このように応答の説明を提供することもできます.
abort(403, 'Unauthorized action.');
このメソッドは、要求ライフサイクルの任意の時点で使用できます.
カスタムHTTPエラーページ
Laravelでは、異なるHTTPステータスコードを返すエラーページは簡単です.例えば、404エラーページをカスタマイズしたい場合は、resources/views/errors/404を作成します.blade.phpファイル.レンダラーが返すすべての404エラーに使用されるビューファイル.なお、このディレクトリの下のビュー名は、対応するHTTPステータスコードと一致する必要があります.
5、ログ
Laravelは強力なMonologライブラリに基づいて簡単なログ抽象層を提供しています.デフォルトでは、Laravelはstorage/logsディレクトリの下で毎日アプリケーションのためにログファイルを生成するように構成されています.Logゲートを使用してログ情報をログに記録することができます.

 User::findOrFail($id)]);
  }
}


このログレコーダは、RFC 5424において定義された8つのログ・レベル:emergency、alert、critical、error、warning、notice、info、debugを提供する.
Log::emergency($error); Log::alert($error); Log::critical($error); Log::error($error); Log::warning($error); Log::notice($error); Log::info($error); Log::debug($error);
コンテキスト情報
コンテキスト・データは、ログ・メソッドに配列形式で渡され、ログ・メッセージとともにフォーマットおよび表示されます.Log::info('User failed to login.', ['id' => $user->id]);
最下位のMonologインスタンスへのアクセス
Monologにはログに使用できる複数のプロセッサがあり、必要に応じてLaravelで使用される最下位のMonologインスタンスにアクセスできます.$monolog = Log::getMonolog();