設定
アプリケーションのログ機能はIlluminate\Foundation\Bootstrap\ConfigureLogging
初期化クラスの中で設定されています。このクラスはconfig/app.php
設定ファイルのlog
オプションを参照しています。
デフォルトでログ機能は日毎のログファイルを使用するように設定されています。しかし、必要に応じてカスタマイズできます。Laravelでは、人気のあるMonologログライブラリーを使用しており、Monologが提供する様々なハンドラーを利用することができます。
例えば、日別のファイルの代わりに同じログファイルを使いたいのでしたら、config/app.php
設定ファイルを以下のように変更してください。
'log' => 'single'
初めからLaravelは、単一ファイル(single
)、日別ファイル(daily
)、 システムログ(syslog
)をサポートしています。しかし、アプリケーションのためにログをカスタマイズしたいのでしたら、ConfigureLogging
初期設定クラスを自由にオーバーライドできます。
エラー詳細
config/app.php
設定ファイルのapp.debug
設定オプションにより、ブラウザに出力されるアプリケーションのエラー詳細をコントロールできます。デフォルトでは、この設定オプションは、.env
ファイルで設定されているAPP_DEBUG
環境変数を反映するように設定されています。
ローカル環境では、APP_DEBUG
環境変数をture
に設定すべきでしょう。実働環境では、この値は常にfalse
にしておいてください。
エラーの処理
全例外はApp\Exceptions\Handler
クラスで処理されます。このクラスはreport
とrender
メソッドで構成されています。
report
メソッドは例外のログや、BugSnagのような外部サービスにメールで送るために使用します。デフォルトでは、例外をログしている親のクラスの基本的な実装へ渡すだけです。しかし、例外をお好きなようにログしてかまいません。それぞれのタイプ例外を異なった方法でログする必要があれば、PHPのinstanceof
比較演算子が使えます。
/**
* 例外をレポートもしくはログする
*
* SentryやBugsnagなどにレポートするために最適な場所
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e)
{
if ($e instanceof CustomException)
{
//
}
return parent::report($e);
}
render
メソッドは例外をHTTPレスポンスに変換し、ブラウザに送り返す役割を持っています。デフォルトでは、例外はレスポンスを生成するベースクラスへ渡されます。しかし、例外のタイプを調べ、カスタムレスポンスを返すのも自由です。
例外ハンドラーのdontReport
プロパティは、ログしない例外タイプの配列で構成されています。デフォルトでは、404エラーを示す例外はログファイルに書き込まれません。必要に応じ、他の例外タイプを配列に追加してください。
HTTP例外
いくつかの例外は、サーバーからのHTTPエラーコードを表しています。例えば、「ページが見つかりません(404)」であったり、「認証されていないエラー(401)」であったり、開発者が発生させた500エラーであることもあるでしょう。このようなレスポンスをリターンしたい場合には、以下のように行なってください。
abort(404);
オプションとして、理由を説明することもできます。
abort(403, 'Unauthorized action.');
このメソッドはリクエストのライフサイクル中であれば、いつでも使用できます。
404エラーページのカスタマイズ
全ての404エラーでカスタムビューを返すためには、resources/views/errors/404.blade.php
ファイルを作成してください。アプリケーションで起きる全404エラーに対し、このビューが表示されるようになります。
ログ
Laravelのログ機能は、強力なMonologライブラリーのシンプルな上位レイヤーを提供しています。Laravelはデフォルトで、アプリケーションの日別ログファイルをstorage/logs
ディレクトリーへ作成するように設定されています。ログへ情報を書き込みたい場合は、以下のように行います。
Log::info('これは便利な情報です。');
Log::warning('なんだか悪いことが起きているかも知れません。');
Log::error('何か本当に悪いことが起きています。');
ログはRFC 5424で定義されているdebug、 info、 notice、 warning、 error、 critical、alertの7レベルをサポートしています。
ログメソッドにはコンテキストデーターを配列で渡すこともできます。
Log::info('Log message', ['context' => 'Other helpful information']);
Monologにはログに使えるその他の多彩なハンドラーが用意されています。必要であれば、Laravelが内部で使用しているMonologインスタンスへアクセスすることもできます。
$monolog = Log::getMonolog();
ログに渡される全てのメッセージを捉えるため、イベントを登録することもできます。
ログイベントリスナーの登録
Log::listen(function($level, $message, $context)
{
//
});