【问题标题】:how log all queries of api in lumen 5.7如何在 lumen 5.7 中记录所有 api 查询
【发布时间】:2021-04-04 05:05:49
【问题描述】:

我需要查看在 api 中执行的所有查询。 我尝试了 3 种方法,但它们都不起作用

1:

\Illuminate\Support\Facades\DB::listen(function ($query) {
     Log::info($query->sql, ['Bindings' => $query->bindings, 'Time' => $query->time]);
});

listen 方法不存在。

2:

Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
    Log::debug($query->sql . ' - ' . serialize($query->bindings));
});

这个也不行。

3:

DB::connection("mysql2")->enableQueryLog();
DB::connection("mysql2")->getQueryLog();

我把 1 和 2 放在 bootstrap/app.php 中,第三个放在 api 控制器中。

我应该提到我有不同的数据库。

还有其他方法吗?

【问题讨论】:

  • 你试过laravel debugger吗?
  • listen 的调用可能应该在服务提供商的boot 方法中......但listen 方法在连接上,因此您需要在两个连接上定义该侦听器
  • @BABAKASHRAFI 是的,我试过了,但是由于旧的 php 、 compser 和 packages 无法安装调试器
  • @lagbox 我也尝试了listen 的连接,你能解释一下吗?也许我犯了错误

标签: laravel lumen


【解决方案1】:

您可以尝试在terminable middleware 中使用第三种方法,例如:

namespace Illuminate\Session\Middleware;

use Closure;

class LogQueries
{
    public function handle($request, Closure $next)
    {
        DB::connection("mysql2")->enableQueryLog();
        return $next($request);
    }

    public function terminate($request, $response)
    {
        Log::info('Queries executed', DB::connection("mysql2")->getQueryLog());
        
    }
}

然后您可以在您的app/bootstrap.php 中将其注册为:

$app->middleware([
   App\Http\Middleware\LogQueries::class
]);

这应该在请求开始时启用查询日志,然后在结束时记录所有查询。不利的一面是,如果您执行许多大型查询(如长查询字符串一样大),您需要将它们保存在内存中,直到请求结束,这可能并不理想。

注意:我不完全记得查询日志的数组结构,因此您可能需要调整日志步骤以更好地满足您的需求。

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 2010-09-23
    • 2021-12-24
    • 2017-03-25
    • 2018-04-27
    • 2013-02-18
    • 2015-02-02
    • 2021-06-05
    相关资源
    最近更新 更多