Webアプリケーションの開発中や運用中に、実行時例外が発生することは避けられませんが、例外が発生した際にリクエストの内容がわからないと、問題の原因を特定するのが非常に困難になることがあります。
そこで、Laravelで例外が発生した際に、リクエスト内容をエラーの詳細と共にログに出力するように設定することで、問題の原因を迅速に特定し、調査をスムーズに進めることができるようにする方法について解説をします。
やりたいこと
Laravelアプリケーションで例外が発生したときに、リクエストの詳細情報(URL、HTTPメソッド、リクエストパラメータ、ヘッダーなど)を含むログを出力するように設定します。
これにより、ログから直接、問題の原因を調査するのが容易になります。
コード例
Handler.phpの編集
まず、app/Exceptions/Handler.php
ファイルを開きます。そして、以下のように修正します。
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;
class Handler extends ExceptionHandler
{
/**
* Report or log an exception.
*
* @param \Throwable $exception
* @return void
*
* @throws \Exception
*/
public function report(Throwable $exception)
{
// リクエスト情報を含めて例外をログに記録
$request = Request::all();
$headers = Request::header();
$method = Request::method();
$url = Request::url();
$logData = [
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTraceAsString(),
'url' => $url,
'method' => $method,
'request' => $request,
'headers' => $headers,
];
Log::error('Exception occurred: ' . $exception->getMessage(), $logData);
}
}
コードの説明
-
reportメソッドのオーバーライド:
report
メソッドをオーバーライドし、例外が発生した際にリクエスト情報を含めて例外をログに記録します。親クラスのreport
メソッドを呼び出さず、カスタムロギングのみを行うことで、重複したログの記録を回避します。 -
リクエスト情報の取得:
Request
ファサードを使用して、リクエストの全パラメータ (Request::all()
)、ヘッダー (Request::header()
)、HTTPメソッド (Request::method()
)、およびURL (Request::url()
) を取得します。 -
ログデータの構築:
例外のファイル名、行番号、トレース情報とともに、取得したリクエスト情報を含む配列を構築します。 -
ログの記録:
Log::error
メソッドを使用して、例外メッセージとリクエスト情報を含む詳細なログを記録します。
まとめ
この設定により、Laravelアプリケーションで例外が発生した際に、リクエスト内容を含む詳細なログが記録されるようになります。
これにより、エラーの原因を迅速に特定し、問題解決のための調査が大幅にスムーズになり、リクエスト情報をログに含めることで、特に実行時例外が発生したときの問題解決に役立ちます。