Laravel 5.3 - 如何记录页面上的所有查询?
Laravel 5.3 - How to log all queries on a page?
我和我的团队正在进行一个相当大的项目。查询无处不在 - 在控制器中,在视图中的视图作曲家(延迟加载)以及可能在其他一些服务中。跟踪这一切变得越来越困难,目前页面加载速度相当慢。
我应该在哪里放置 \DB::enableQueryLog() 和 \DB::getQueryLog() 来记录所有查询并转储它们?基本上我正在寻找代码中发生在任何查询发生之前的某个地方(放置 enableQueryLog()),我正在寻找一个发生在视图呈现之后的地方(转储 getQueryLog())。
解决这个问题的好方法是什么?
提前致谢。
添加一个在请求完成后执行并记录您的查询的中间件...请参阅Terminable Middlwares
完美的例子来了:
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
]);
});
您在使用 MySQL 吗?你可以只跟踪日志。
How to show the last queries executed on MySQL?
或者使用 Laravel 调试栏?
您可以将其添加到 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));
}
});
}
}
如果您想打印在您的应用程序上执行的查询,请执行以下步骤。
步骤 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.
尽情享受....
将此代码放在执行查询的代码的正上方
\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));
});
此外还有可用的软件包:
记录我的查询
https://packagist.org/packages/technoknol/log-my-queries
只需安装并将其添加到中间件中即可。它将在 laravel.log
默认日志文件中记录所有查询。
我和我的团队正在进行一个相当大的项目。查询无处不在 - 在控制器中,在视图中的视图作曲家(延迟加载)以及可能在其他一些服务中。跟踪这一切变得越来越困难,目前页面加载速度相当慢。
我应该在哪里放置 \DB::enableQueryLog() 和 \DB::getQueryLog() 来记录所有查询并转储它们?基本上我正在寻找代码中发生在任何查询发生之前的某个地方(放置 enableQueryLog()),我正在寻找一个发生在视图呈现之后的地方(转储 getQueryLog())。
解决这个问题的好方法是什么?
提前致谢。
添加一个在请求完成后执行并记录您的查询的中间件...请参阅Terminable Middlwares
完美的例子来了:
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
]);
});
您在使用 MySQL 吗?你可以只跟踪日志。
How to show the last queries executed on MySQL?
或者使用 Laravel 调试栏?
您可以将其添加到 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));
}
});
}
}
如果您想打印在您的应用程序上执行的查询,请执行以下步骤。
步骤 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.
尽情享受....
将此代码放在执行查询的代码的正上方
\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));
});
此外还有可用的软件包:
记录我的查询
https://packagist.org/packages/technoknol/log-my-queries
只需安装并将其添加到中间件中即可。它将在 laravel.log
默认日志文件中记录所有查询。