Laravel で実行されたSQLをログに表示したい

Laravelは、ORM機能によってSQLを直接書かずにデータベース操作を行えてコーディングがとても楽です。しかし、デバッグ作業で実行されたSQLを実際に見たい場合も多々あります。そういった場合に、logファイルに実行されたSQL文を出力する二つの方法をご紹介いたします。

enableQueryLog() を使った方法

こちらは最も手軽なSQLのプリントデバッグ方法です。

php
    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 を実行すれば、次のような形で出力されるはずです。
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.phproutes/api.phpにて、以下のようにミドルウェアを適用します。

php
use App\Http\Middleware\LogSqlQueries;

Route::middleware([LogSqlQueries::class])->group(function () {
    Route::get('/persons', [PersonController::class, 'index']);
    // 他のルート
});

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム