概要
APIが呼ばれるたびに、リクエストの内容と、発行されたクエリをログ出力させるミドルウェアを作成します。デバッグやパフォーマンス改善に活用できます。
前提知識
ミドルウェアとは?
HTTPリクエストがアプリケーションに到達する前に、リクエストをフィルタリングまたは操作する層です。以下のような処理ができます。
- 認証の確認
- CORSの設定
- メンテナンスモードのチェック
- フォームデータのトリミングや変換
ミドルウェアは、Kernel.php ファイルを通じてアプリケーション全体または特定のルートに適用できます。
Kernel.phpについて
Laravelの Kernel.php は、アプリケーションのリクエストライフサイクルを管理するファイルです。HTTPリクエストを管理するapp/Http/Kernel.php
と、コンソールコマンドを管理する app/Console/Kernel.php
の2種類あります。
今回使うのはapp/Http/Kernel.php
です。
ミドルウェアの作成
まず、クエリログを有効にし、リクエストの内容とクエリログをログに出力するためのLogQueries ミドルウェアを作ります。
/laravel/app/Http/Middleware/LogQueries.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class LogQueries
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// クエリログを有効化
DB::enableQueryLog();
// リクエストの処理
$response = $next($request);
// クエリログを取得
$queries = DB::getQueryLog();
// リクエストとクエリログをログに出力
Log::info('クエリログ:', [
'method' => $request->getMethod(),
'url' => $request->fullUrl(),
'input' => $request->all(),
'queries' => $queries,
]);
return $response;
}
}
ミドルウェアの登録
次に、作成したミドルウェアを Kernel.php に登録し、APIのミドルウェアグループに追加します。
/laravel/app/Http/Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
// ... existing code ...
protected $middlewareGroups = [
'web' => [
// ... existing middleware ...
],
'api' => [
...
\App\Http\Middleware\LogQueries::class, // ここに追加
],
];
// ... existing code ...
}
これで完了です。Laravelのログ設定に応じて、 APIリクエストが行われるたびにstorage/logs/laravel.log
にログが出力されます。
出力されるログの例
[2024-06-24 15:05:26] local.INFO: クエリログ {"method":"GET","url":"https://.../get","input":[],"queries":["select count(*) as aggregate from \"..."]}