😺
Laravelのログを識別しやすく!リクエストIDをログに埋め込む方法
背景
稼働中のLaravelアプリケーションで不具合が発生しその原因を調査するために、対象のエラーが発生した時のログを確認したかったのですがその特定に時間がかかりました。
そこで、各リクエストごとに識別子(リクエストID)を付与しログとレスポンスに記録することで、ログを特定しやすくしました。
今回はその方法について紹介します。
やり方
やり方はとても簡単で、公式ドキュメントにも記載されている方法になります。 (公式ドキュメント)
リクエストごとにリクエストIDを作成し、それをログのコンテキストに追加するミドルウェアを作成します。
ミドルウェアのコード
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;
class AssignRequestId
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
$requestId = (string) Str::uuid();
Log::withContext([
'request-id' => $requestId,
]);
$response = $next($request);
$response->headers->set('Request-Id', $requestId);
return $response;
}
}
これをミドルウェアとして登録してあげるとすべてのリクエストに対してリクエストIDが付与され、ログ出力時に表示してくれるようになります。
ログの出力結果
エラー発生時は以下のような形でリクエストIDを含むログを出力するようになります。
[2025-03-11 15:00:37] local.ERROR: エラー発生 {"request-id":"086de320-5e9a-450d-bfeb-afd417c6d2f0","exception":"[object] (Exception(code: 0): エラー発生 at /log-app/app/Http/Controllers/Api/HelloController.php:13)
[stacktrace]
#0 /log-app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(47): App\\Http\\Controllers\\Api\\HelloController->index()
#1 /log-app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(266): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Api\\HelloController), 'index')
#2 /log-app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\Route->runController()
#3 /log-app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(808): Illuminate\\Routing\\Route->run() ....
レスポンスのヘッダーにも'Request-id'として値を渡しているので、エラー発生時にはこれを元にログを特定することができます。
HTTP/1.1 200 OK
Host: 127.0.0.1:8000
Connection: close
X-Powered-By: PHP/8.4.2
Cache-Control: no-cache, private
Date: Tue, 11 Mar 2025 14:37:36 GMT
Content-Type: application/json
Request-Id: 57d7f0f3-26d9-41b6-b299-c0d344e8ac9b
Access-Control-Allow-Origin: *
まとめ
稼働中のアプリケーションでは大量のログが記録されるため、該当するログを特定するのに時間がかかることがあります。
これを解決するために、リクエストごとにリクエストIDを生成し、ログとレスポンスに記録する方法を紹介しました。
また、リクエストIDだけでなくユーザーIDなどの情報も載せることができるので必要に応じて追加情報を組み合わせることでより詳細なログになると思います。
Discussion