設定

アプリケーションのログハンドラーは、app/start/global.phpスタートファイルで登録されています。デフォルトでは、このロガーはログファイルを一つだけ使用するように設定されています。しかしながら、必要であれば、この動作を変更できます。Laravelは人気のあるMonologログライブラリーを使用していますので、このライブラリーが提供する様々なハンドラーを利用できる長所があります。

例えば、大きな1ファイルにログを残す代わりに、日毎のファイルへログしたい場合は、スタートファイルを以下のように修正してください。

$logFile = 'laravel.log';

Log::useDailyFiles(storage_path().'/logs/'.$logFile);

エラー詳細

デフォルトではアプリケーションのエラー詳細は出力される設定になっています。これはエラー発生時にエラーページでスタックトレースとエラーメッセージを表示するためです。エラーの詳細を表示しないようにするためには、app/config/app.phpファイル中のdebugオプションをfalseに設定してください。

Note: 特に実機での運用環境では、エラー詳細表示をオフにしておくことを強く推奨します。

エラーの処理

デフォルトでは、app/start/global.phpファイルで全ての例外の処理を行なっています。

App::error(function(Exception $exception)
{
    Log::error($exception);
});

これはもっとも基本的なエラー処理です。必要に応じ、もっと多くの処理を指定してください。ハンドラーは処理する例外のタイプヒントを元に呼び出されます。例えば、RuntimeExceptionのみを処理するハンドラーを作成したいのならば:

App::error(function(RuntimeException $exception)
{
    // この例外を処理する...
});

もし例外ハンドラーが、レスポンスをリターンしたら、それはブラウザーに送信され、他のハンドラーは呼び出されません。

App::error(function(InvalidUserException $exception)
{
    Log::error($exception);

    return '恐れ入ります。このアカウントで不具合が発生したようです!';
});

PHPのfatalエラーをリッスンするにはApp::fatalメソッドを使用します。

App::fatal(function($exception)
{
    //
});

複数の例外ハンドラーを使用する場合、一般的なものから限定的なものへの順番で定義してください。例えば、全部の例外を処理するタイプExceptionの例外のハンドラーは、カスタム例外、例えばIlluminate\Encryption\DecryptExceptionのハンドラーより前で定義する必要があります。

エラーハンドラーの設置場所

エラーハンドラーを登録しておく、決まったデフォルトの設置場所はありません。Laravelでは、皆さんに自由に決めてもらっています。start/global.phpファイルに設置するのはひとつのオプションです。一般的に、このファイルは「初期設定」コードを設置するために便利な場所と言えるでしょう。このファイルが乱雑になってきたら、app/errors.phpファイルを作成し、start/global.phpスクリプトの中からrequireすることもできます。3つ目のオプションはサービスプロバイダーでハンドラーを登録する方法です。いずれにせよ、「正しい」一つの答えは存在しません。皆さんが快適に思える場所で設定してください。

HTTP例外

いくつかの例外は、サーバーからのHTTPエラーコードを表しています。例えば、「ページが見つかりません(404)」であったり、「認証されていないエラー(401)」であったり、開発者が発生させた500エラーであることもあるでしょう。このようなレスポンスをリターンしたい場合には、以下のように行なってください。

App::abort(404);

オプションとして、理由を説明することもできます。

App::abort(403, 'Unauthorized action.');

このメソッドはリクエストのライフサイクル中であれば、いつでも使用できます。

404エラーの処理

カスタム404エラーページを表示するのは簡単で、アプリケーション中の全「404 見つかりません」エラーを処理するためのエラーハンドラーを登録し、エラービューをリターンしてください。

App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});

ログ

Laravelのログ機能はパワフルなMonologをラップした、シンプルなレイヤーです。Laravelはアプリケーションにログファイルを一つ作成し、app/storage/logs/laravel.logに保存するデフォルト設定になっています。以下のように、情報をログできます。

Log::info('なにか役に立つ情報');

Log::warning('悪いことが起きている可能性がある情報');

Log::error('本当に悪いことが起きた情報');

ログはRFC 5424で定義されているdebuginfonoticewarningerrorcriticalalertの7レベルをサポートしています。

ログメソッドにはコンテキストデーターを配列で渡すこともできます。

Log::info('Log message', array('context' => 'Other helpful information'));

Monologにはログに使えるその他の多彩なハンドラーが用意されています。必要であれば、Laravelが内部で使用しているMonologインスタンスへアクセスすることもできます。

$monolog = Log::getMonolog();

ログに渡される全てのメッセージを捉えるため、イベントを登録することもできます。

ログリスナーを登録する

Log::listen(function($level, $message, $context)
{
    //
});