設定
アプリケーションのログ機能は、Illuminate\Foundation\Bootstrap\ConfigureLogging
初期化クラスの中で設定しています。このクラスはconfig/app.php
設定ファイルのlog
オプションを参照します。
デフォルトのログ機能は、日別のログファイルを使用するように設定されています。これは必要に応じてカスタマイズできます。LaravelはポピュラーなMonologログライブラリーを使用しています。Monologが提供する様々なハンドラーを利用することができます。
例えば、日別のファイルの代わりに同じログファイルを続けて使用したい場合、config/app.php
設定ファイルを以下のように変更してください。
'log' => 'single'
Laravelは初めから、単一ファイル(single
)、日別ファイル(daily
)、
システムログ(syslog
)、エラーログ(errorlog
)ログモードをサポートしています。。しかし、アプリケーションに合わせるため、ログをカスタマイズしたいのでしたら、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, '許可されていないアクションです。');
このメソッドはリクエストのライフサイクル中であれば、いつでも使用できます。
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)
{
//
});