【问题标题】:Laravel 5.3 - How to log all queries on a page?Laravel 5.3 - 如何记录页面上的所有查询?
【发布时间】:2017-04-30 23:58:43
【问题描述】:

我和我的团队正在开展一个相当大的项目。到处都有查询——在控制器中,在视图中的视图作曲家(延迟加载)中,可能在其他一些服务中也是如此。跟踪这一切变得越来越困难,目前页面加载速度相当慢。

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

什么是解决这个问题的好方法?

提前致谢。

【问题讨论】:

标签: php laravel laravel-5.3


【解决方案1】:

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

【讨论】:

  • 到那时查询已经完成,因为在请求完成时会调用可终止的中间件。
【解决方案2】:

完美的例子来了:

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

【讨论】:

  • 据我了解,这开始监听查询,但我会在哪里转储它们?我看到链接到可终止中间件的其他答案。那么一个好方法是在中间件中实现 terminate() 方法并将其转储到那里?
  • 你可以只记录::info($query->sql)
  • 是的。需要时易于实施。使用\Log::debug('query', [...]),我能够将所有内容记录到 laravel 日志中,并发现正在执行的查询效率低下,而我可以在其中急切加载。谢谢。
  • 它不显示数据库事务在哪里启动和提交。
【解决方案3】:

你在使用 MySQL 吗?你可以直接跟踪日志。

How to show the last queries executed on MySQL?

或者使用 Laravel 调试栏?

【讨论】:

    【解决方案4】:

    你可以将它添加到 Providers/AppServiceProvider.php 文件中,并在 laravel 日志文件中使用 tail 进行检查:

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

    【讨论】:

    • 感谢Event::listen,我在DB::listen 的测试环境中遇到错误
    【解决方案5】:

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

    第 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。

    享受....

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        另外还有包:

        记录我的查询

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

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

        【讨论】:

          猜你喜欢
          • 2019-11-04
          • 1970-01-01
          • 1970-01-01
          • 2018-04-27
          • 2013-02-18
          • 2015-02-02
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多