Laravel中如何记录输出mysql数据库的sql日志log

Laravel框架
432
0
0
2022-05-01

平常正常调试代码时,总想知道mysq执行了一些什么,这样比较稳妥一些

网上有一个版本,貌似遇到like语句,加上%号后,就会报这个错

ErrorException

vsprintf(): Too few arguments

所以我改良了一个版本,代码如下

if (app()->isLocal()) {
    DB::listen(function ($query) {
        $sql = $query->sql;
        foreach ($query->bindings as $key => $value) {
            if (is_numeric($key)) {
                if (is_numeric($value)) {
                    $sql = preg_replace('/\?/', $value, $sql, 1);
                } else {
                    $sql = preg_replace('/\?/', sprintf('\'%s\'', $value), $sql, 1);
                }
            } else {
                if (is_numeric($value)) {
                    $sql = str_replace(':' . $key, $value, $sql);
                } else {
                    $sql = str_replace(':' . $key, sprintf('\'%s\'', $value), $sql);
                }
            }
        }

        $sql = str_replace('\\', '', $sql);
        Log::info(' run-time: ' . $query->time . 'ms; ' . $sql . "\n\n\t");
    });
}

把以上代码拷贝到AppServiceProvider.php里,就可以在storage/logs/laravel.log里看到执行的所有sql了

若有问题,可以反馈给我