Laravelでクエリをすべてログに記録する方法


  1. .envファイルの設定: まず、Laravelプロジェクトのルートディレクトリにある.envファイルを開きます。以下の設定を追加します。
DB_DEBUG=true

この設定により、Laravelはクエリのログを有効にし、storage/logsディレクトリに保存します。

  1. ログの設定: 次に、Laravelのログ設定を変更します。config/logging.phpファイルを開き、以下のように変更します。
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['daily'],
    ],
    // 他のログチャネルの設定...
    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 14,
    ],
],

上記の変更により、Laravelはdailyチャネルを使用してログを記録します。ログのレベルはdebugに設定されており、storage/logs/laravel.logファイルに保存されます。

  1. クエリログの表示: 上記の設定が完了したら、クエリログを表示する方法をいくつか紹介します。

a. ルートファイルで直接表示する方法: routes/web.phpファイルに以下のルートを追加します。

Route::get('/queries', function () {
    \DB::listen(function ($query) {
        var_dump($query->sql, $query->bindings, $query->time);
    });
});

上記のルートをアクセスすると、実行されたクエリとそのバインディングパラメータ、実行時間が表示されます。

b. イベントリスナーを使用する方法: イベントリスナーを作成し、クエリイベントをキャッチしてログに書き込む方法もあります。まず、以下のコマンドでイベントリスナーを生成します。

php artisan make:listener QueryListener

生成されたapp/Listeners/QueryListener.phpファイルを以下のように編集します。

namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\Log;
class QueryListener
{
    public function handle(QueryExecuted $query)
    {
        Log::debug($query->sql, [
            'bindings' => $query->bindings,
            'time' => $query->time,
        ]);
    }
}

次に、app/Providers/EventServiceProvider.phpファイルを開き、以下のようにイベントリスナーを登録します。

protected $listen = [
    QueryExecuted::class => [
        QueryListener::class,
    ],
];

これにより、クエリが実行されるたびにQueryListenerが呼び出され、ログにクエリの情報が記録されます。

これらの方法を使用することで、Laravelで実行されるすべてのクエリをログに記録することができます。デバッグやパフォーマンスの分析に役立つだけでなく、クエリの実行状況を把握するのにも便利です。