Laravel で実行されたSQLをログに表示したい
Laravelは、ORM機能によってSQLを直接書かずにデータベース操作を行えてコーディングがとても楽です。しかし、デバッグ作業で実行されたSQLを実際に見たい場合も多々あります。そういった場合に、logファイルに実行されたSQL文を出力する二つの方法をご紹介いたします。
enableQueryLog() を使った方法
こちらは最も手軽なSQLのプリントデバッグ方法です。
php
tail -f ./storage/logs/laravel.log を実行すれば、次のような形で出力されるはずです。 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'));
}
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,
),
)
しかしながら、毎回囲うのは手間ですし、管理もしずらくなります。
php
DB::enableQueryLog();
...
$queries = DB::getQueryLog();
Log::info($queries);
そこで次に紹介する方は、ミドルウェアを使って、ルーターレベルで一括管理できる方法を紹介いたします。
ミドルウェアを使った方法
ミドルウェアの作成
まず、ミドルウェアを作成します。
bash
php artisan make:middleware LogSqlQueries
生成されたミドルウェアファイルに以下のコードを追加します。
php
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にて、以下のようにミドルウェアを適用します。
php
use App\Http\Middleware\LogSqlQueries;
Route::middleware([LogSqlQueries::class])->group(function () {
Route::get('/persons', [PersonController::class, 'index']);
// 他のルート
});