可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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.
回答1:
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
]);
});
回答2:
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));
}
});
}
}
回答3:
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));
});
回答4:
add a middleware that executes after the request is done and logs your queries ... see Terminable Middlwares
回答5:
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?
回答6:
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....
回答7:
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.