設定

アプリケーションのログ機能は、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クラスで処理されます。このクラスはreportrenderメソッドで構成されています。

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で定義されているdebuginfonoticewarningerrorcriticalalertの7レベルをサポートしています。

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

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

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

$monolog = Log::getMonolog();

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

ログイベントリスナーの登録

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