文書の過去の版を表示しています。
本当は MySQL などが吐き出すクエリログを見るのが一番よいのですが、サーバの権限によっては残念ながら見れないことも。
そんなときは、以下の設定を行うことで、Laravel で実行した sql クエリのログを吐き出すことが可能です。
AppServiceProvider.php の boot 関数内に処理を追加します。
app\Providers\AppServiceProvider.php
- <?php
- namespace App\Providers;
- use Illuminate\Support\ServiceProvider;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Validator;
- use DB;
- class AppServiceProvider extends ServiceProvider
- {
- public function boot()
- {
- // 本番環境では出力しない
- if (config('app.env') !== 'production') {
- DB::listen(function ($query) {
- $sql = $query->sql;
- $cnt = count($query->bindings);
- for ($i=0; $i<$cnt; $i++) {
- $binding = $query->bindings[$i];
- if (strlen($binding) > 200) {
- $binding = mb_strimwidth($binding, 0, 200, '...');
- }
- $sql = preg_replace("/\?/", $binding, $sql, 1);
- }
- // channel で出力先のチャンネルを指定
- // info に出力したい文字列を指定
- Log::channel('sqllog')->info('[' . $query->time . 'ms] ' . $sql);
- });
- }
- }
- }
コンフィグの logging.php に sql ログ用チャンネルの追加。
config\logging.php
- 'channels' => [
- // channels 内の一番下に追加
- 'sqllog' => [
- 'driver' => 'daily',
- 'path' => storage_path('logs/sql.log'),
- 'level' => 'debug',
- 'days' => 14,
- 'permission' => 0664, // パーミッションエラーが出るなら必要に応じて指定
- ],
- ],
- ];
コメント