简体   繁体   中英

Laravel 5.3 - How to log all queries on a page?

My team and I are working on a rather big project. There's queries going on everywhere - in controllers, in view composers in views (lazy loading) and probably in some other services as well. It's getting hard to keep a track of it all and the page load speed is fairly slow at the moment.

Where would I put \\DB::enableQueryLog() and \\DB::getQueryLog() to log ALL the queries and dump them? Basically I'm looking for some place in code that happens before any of the queries happen (to put enableQueryLog()) and I'm looking for a place that happens after the views render (to dump getQueryLog()).

What would be a good way to go about this?

Thanks in advance.

Here comes the perfect example:

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

Open app\\Providers\\AppServiceProvider.php and add the following to Boot() function:

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

You can add this to the Providers/AppServiceProvider.php file and check them in the laravel log file with tail:

tail -f storage/logs/laravel.log

You can even filter with queries you want to log. For example, here I was using Laravel Passport, and didn't want to log all the oauth queries.

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

If you want to print a query which is executed on your app do following steps.

Step1 : Go to your AppServiceProvider.php file. // File path App\\Providers\\AppServiceProvider.php

Step2 : Make boot() method and paste below code.

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

Step3 : Now you can see you queries in lumen.log or laravel.log file. File path is laravel_app\\storage\\logs\\laravel.log or lumen.log.

Enjoy....

Put this code right above the code where your query is executed

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

Just modified for executable query:

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

添加在请求完成后执行的中间件并记录您的查询...请参阅Terminable Middlwares

Are you using MySQL? You can just tail the log.

How to show the last queries executed on MySQL?

Or use the Laravel Debug Bar?

Additioanlly There's package available also:

log-my-queries

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

Just install and add it's entry to middleware. It will log all the queries in laravel.log default log file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM