Laravel 5.3 - Как регистрировать все запросы на странице?

Моя команда и я работаем над довольно большим проектом. Там запросы происходят повсюду - в контроллерах, в виду композиторов в представлениях (ленивая загрузка) и, вероятно, в некоторых других сервисах. Это усложняет отслеживание всего этого, и скорость загрузки страницы на данный момент довольно медленная.

Где бы я поместил \DB :: enableQueryLog() и \DB :: getQueryLog(), чтобы регистрировать ВСЕ запросы и выгружать их? В основном я ищу какое-то место в коде, которое происходит до того, как произойдет какой-либо из запросов (поставить enableQueryLog()), и я ищу место, которое происходит после рендеринга представлений (для дампа getQueryLog()).

Что было бы хорошим путем?

Заранее спасибо.

Ответ 1

Вот прекрасный пример:

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

Откройте приложение\Providers\AppServiceProvider.php и добавьте следующую функцию Boot():

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

Ответ 2

Вы можете добавить это в файл 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));
            }
        });
    }
}

Ответ 3

Если вы хотите напечатать запрос, который выполняется в вашем приложении, выполните следующие действия.

Шаг 1. Перейдите в файл AppServiceProvider.php.//Путь к файлу App\Providers\AppServiceProvider.php

Шаг 2: создайте метод boot() и вставьте приведенный ниже код.

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

Шаг 3. Теперь вы можете видеть свои запросы в файле lumen.log или laravel.log. Путь к файлу: laravel_app\storage\logs\laravel.log или lumen.log.

Наслаждаться....

Ответ 4

Поместите этот код прямо над кодом, где выполняется ваш запрос

\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));
});

Ответ 5

добавьте промежуточное программное обеспечение, которое выполняется после выполнения запроса и регистрирует ваши запросы... см. Terminable Middlwares

Ответ 7

Также доступен пакет:

срубы мои-запросы

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

  Просто установите и добавьте запись в промежуточное ПО. Все запросы будут записываться в файл журнала по умолчанию laravel.log.