Laravel で実行されたSQLをログに表示したい
はじめに
Laravelは、ORM機能によってSQLを直接書かずにデータベース操作を行えてコーディングがとても楽です。しかし、デバッグ作業で実行されたSQLを実際に見たい場合も多々あります。そういった場合に、logファイルに実行されたSQL文を出力する二つの方法をご紹介いたします。
enableQueryLog() を使った方法
こちらは最も手軽なSQLのプリントデバッグ方法です。
public function index()
{// SQLログを有効にする
DB::enableQueryLog();
$perPage = config('constants.pagination.per_page');
$persons = Person::where('delete_flg', 0)->paginate($perPage);
// 実行されたSQLを取得
$queries = DB::getQueryLog();
Log::info($queries);
return view('persons.index', compact('persons'));
}
tail -f ./storage/logs/laravel.log
を実行すれば、次のような形で出力されるはずです。
[2024-07-23 20:07:59] development.INFO: array (
0 =>
array (
'query' => 'select count(*) as aggregate from `a_m_person` where `delete_flg` = ? and `user_id` = ?',
'bindings' =>
array (
0 => 0,
1 => 7,
),
'time' => 0.61,
),
1 =>
array (
'query' => 'select * from `a_m_person` where `delete_flg` = ? and `user_id` = ? limit 2 offset 2',
'bindings' =>
array (
0 => 0,
1 => 7,
),
'time' => 0.72,
),
)
しかしながら、毎回囲うのは手間ですし、管理もしずらくなります。
DB::enableQueryLog();
...
$queries = DB::getQueryLog();
Log::info($queries);
そこで次に紹介する方は、ミドルウェアを使って、ルーターレベルで一括管理できる方法を紹介いたします。
ミドルウェアを使った方法
ミドルウェアの作成
まず、ミドルウェアを作成します。
php artisan make:middleware LogSqlQueries
生成されたミドルウェアファイルに以下のコードを追加します。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class LogSqlQueries
{/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{// SQLログを有効にする
DB::enableQueryLog();
$response = $next($request);
// 実行されたSQLを取得
$queries = DB::getQueryLog();
Log::info('SQL Queries:', $queries);
return $response;
} }
ミドルウェアをルートに適用
次に、ミドルウェアを適用したいルートにミドルウェアを登録します。routes/web.php
やroutes/api.php
にて、以下のようにミドルウェアを適用します。
use App\Http\Middleware\LogSqlQueries;
class])->group(function () {
Route::middleware([LogSqlQueries::'/persons', [PersonController::class, 'index']);
Route::get(// 他のルート
; })