Laravel 5.3 - 如何记录页面上的所有查询?

时间:2016-12-15 11:35:36

标签: php laravel laravel-5.3

我和我的团队正在开展一个相当大的项目。随处可见的查询 - 在控制器中,在视图中的视图作曲家(延迟加载)以及可能在其他一些服务中。现在越来越难以跟踪这一切,目前页面加载速度相当慢。

我将把\ DB :: enableQueryLog()和\ DB :: getQueryLog()放在哪里记录所有查询并转储它们?基本上我正在寻找在任何查询发生之前发生的代码中的某个位置(放置enableQueryLog())并且我正在寻找在视图呈现之后发生的位置(转储getQueryLog())。

有什么好办法可以解决这个问题?

提前致谢。

7 个答案:

答案 0 :(得分:28)

以下是一个完美的例子:

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

答案 1 :(得分:8)

您可以将它添加到Providers / AppServiceProvider.php文件中,并使用tail在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));
            }
        });
    }
}

答案 2 :(得分:1)

如果要打印在应用程序上执行的查询,请执行以下步骤。

步骤1 :转到您的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
                );
            });
        }
    }

Step3 :现在,您可以在lumen.log或laravel.log文件中看到查询。文件路径为laravel_app \ storage \ logs \ laravel.log或lumen.log。

享受。...

答案 3 :(得分:1)

将此代码放在执行查询的代码上方

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您使用的是MySQL吗?你可以拖尾日志。

How to show the last queries executed on MySQL?

或者使用Laravel Debug Bar?

答案 6 :(得分:0)

Additioanlly也提供软件包:

log-my-queries

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

只需安装并将其条目添加到中间件。它将所有查询记录在laravel.log默认日志文件中。