webman-laravel-orm下想把执行后的SQL写入日志中

zeus

下面这段代码是基于laravel框架的,主要监听SQL查询,并记录下整条sql日志;
在webman中应该放到哪里呢? 请大佬帮忙看下哈。

DB::listen(function ($query) {
    $sql = $query->sql;
    $bindings = [];
    if ($query->bindings) {
        foreach ($query->bindings as $v) {
            if (is_numeric($v)) {
                $bindings[] = $v;
            } else {
                $bindings[] = '"' . strval($v) . '"';
            }
        }
    }
    $execute = Str::replaceArray('?', $bindings, $sql);
    logs('sql')->info('SQL ' . $execute);
});
1922 2 6
2个回答

walkor

新建 app/bootstrap/LaravelLog.php (目录不存在请自行创建)

<?php
namespace app\bootstrap;

use Webman\Bootstrap;
use support\Db;

class LaravelLog implements Bootstrap
{
    public static function start($worker)
    {
        Db::listen(function ($query) {
            $sql = $query->sql;
            $bindings = [];
            if ($query->bindings) {
                foreach ($query->bindings as $v) {
                    if (is_numeric($v)) {
                        $bindings[] = $v;
                    } else {
                        $bindings[] = '"' . strval($v) . '"';
                    }
                }
            }
            $execute = Str::replaceArray('?', $bindings, $sql);
            logs('sql')->info('SQL ' . $execute);
        });
    }
}

在 config/bootstrap.php 里加一行配置,

return [
    // ... 省略了其他配置...

    app\bootstrap\LaravelLog::class
];

这样进程启动的时候就会自动执行app\bootstrap\LaravelLog的start方法

  • zeus 2022-01-28

    好的,谢谢亮哥。

  • 大好时光 2022-02-22

    想问问 laravel 的各类组件要怎么接入,比如saved、saving等,已经引入event事件库了

  • tanhongbin 2022-03-23

    为啥我照着写,发现没有执行呀,也不报错

wadeYang

app/bootstrap/LaravelLog.php
文件内容,应该如下,否则会报错

<?php
namespace app\bootstrap;

use Webman\Bootstrap;
use support\Db;
use Illuminate\Support\Str; //新增
use support\Log;//新增

class LaravelSqlLog implements Bootstrap
{
    public static function start($worker)
    {
        Db::listen(function ($query) {
            $sql = $query->sql;
            $bindings = [];
            if ($query->bindings) {
                foreach ($query->bindings as $v) {
                    if (is_numeric($v)) {
                        $bindings[] = $v;
                    } else {
                        $bindings[] = '"' . strval($v) . '"';
                    }
                }
            }
            $execute = Str::replaceArray('?', $bindings, $sql);
            //logs('sql')->info('SQL ' . $execute);
            Log::info('SQL ' . $execute);//新增
        });
    }
}
  • 暂无评论
年代过于久远,无法发表回答
🔝