web-dev-qa-db-ja.com

Laravel 5.3-ページ上のすべてのクエリを記録するには?

私のチームと私はかなり大きなプロジェクトに取り組んでいます。コントローラー、ビュー内のビューコンポーザー(遅延ロード)、およびおそらく他のサービスでも、クエリはどこにでもあります。すべてを追跡するのは難しくなり、ページの読み込み速度は現時点ではかなり遅くなっています。

すべてのクエリをログに記録してダンプするには、\ DB :: enableQueryLog()および\ DB :: getQueryLog()をどこに配置しますか?基本的に、クエリが発生する前に発生するコード内の場所を探しています(enableQueryLog()を配置するため)。ビューがレンダリングされた後に発生する場所を探しています(getQueryLog()をダンプするため)。

これについてはどうすればいいでしょうか?

前もって感謝します。

18
DevK

これが完璧な例です。

https://laravel.com/docs/5.3/database#listening-for-query-events

app\Providers\AppServiceProvider.phpを開き、次をBoot()関数に追加します。

DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});
30
Hudson Pereira

これをProviders/AppServiceProvider.phpファイルに追加し、laravel末尾付きのログファイルで確認できます。

tail -f storage/logs/laravel.log

ログに記録するクエリでフィルタリングすることもできます。たとえば、ここではLaravel= Passportを使用しており、すべてのoauthクエリをログに記録したくありませんでした。

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;

public function register() {
    if (App::environment('local') && env('APP_URL') == 'http://localhost') {
        Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
            // filter oauth ones
            if (!str_contains($query->sql, 'oauth')) {
                Log::debug($query->sql . ' - ' . serialize($query->bindings));
            }
        });
    }
}
9
buzkall

アプリで実行されるクエリを印刷する場合は、次の手順を実行します。

Step1:AppServiceProvider.phpファイルに移動します。 //ファイルパスApp\Providers\AppServiceProvider.php

Step2:boot()メソッドを作成し、以下のコードを貼り付けます。

public function boot() {
        // Log queries
        if (true) {
            \DB::listen(function ($query) {
                \Log::info(
                    $query->sql, $query->bindings, $query->time
                );
            });
        }
    }

Step:Lumen.logまたはlaravel.logファイルでクエリを確認できます。ファイルパスは、laravel_app\storage\logs\laravel.logまたはLumen.logです。

楽しい....

1
Umang Soni

クエリが実行されるコードのすぐ上にこのコードを配置します

\DB::listen(function($sql) {
  die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});

実行可能なクエリ用に変更したばかりです:

\DB::listen(function ($query) {
   // Enclose in single quotes for string params.
   $bindings = collect($query->bindings)->map(function ($param) {
      if(is_numeric($param)) {
        return $param;
      } else {
        return "'$param'";
      }
   });

   \Log::info(\Illuminate\Support\Str::replaceArray('?', $bindings->toArray(), $query->sql));
});
1
Elco

また、利用可能なパッケージがあります:

ログマイクエリ

https://packagist.org/packages/technoknol/log-my-queries

ミドルウェアにエントリをインストールして追加するだけです。 laravel.logデフォルトログファイルにすべてのクエリを記録します。

0
shyammakwana.me

リクエストの完了後に実行され、クエリを記録するミドルウェアを追加します... Terminable Middlwares を参照してください

0
Sherif

MySQLを使用していますか?ログを末尾に置くだけです。

MySQLで最後に実行されたクエリの表示方法

または、Laravel Debug Bar?

0
Mick