首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 记录SQL日志

Laravel 记录SQL日志

作者头像
崔哥
发布2023-01-01 09:55:07
1.3K0
发布2023-01-01 09:55:07
举报
文章被收录于专栏:崔哥的专栏崔哥的专栏

Laravel 默认只在sql语法错误时提示完整的sql日志,但实际情况接口慢,筛选条件和预期不符等,都需要看到sql语句,通过sql语句判断问题所在

下面介绍实现方式

第一步

修改 AppServiceProvider.php

vi app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->registerSqlDebug();
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    protected function registerSqlDebug()
    {
        if (config('logging.enable_log_sql', false)) {
            $print = false;
            if ($this->app->environment('local') && env('IS_UNIT')) {
                $print = true;
            }

            DB::listen(function ($query) use ($print) {
                $sql = $query->sql;
                foreach ($query->bindings as $binding) {
                    $value = is_numeric($binding) ? $binding : "'{$binding}'";
                    $sql   = preg_replace('/\?/', (string) $value, $sql, 1);
                }
                $sql              = sprintf('【%s】 %s', $this->format_duration($query->time / 1000), $sql);
                Log::channel('sql')->debug($sql);
                if ($print) {
                    dump($sql);
                }
            });

        }
    }

    private function format_duration($seconds): string
    {
        if ($seconds < 0.001) {
            return round($seconds * 1000000) . 'μs';
        } elseif ($seconds < 1) {
            return round($seconds * 1000, 2) . 'ms';
        }

        return round($seconds, 2) . 's';
    }
}

第二步

修改 config/logging.php

增加sql日志开关

    /**
     * 开启sql日志
     */
    'enable_log_sql' => env('LOG_SQL_ENABLED', true),

日志默认输出到 storage/logs/laravel.log文件,为了区分开,增加以下配置

        'sql'           => [
            'driver' => 'daily',
            'path'   => storage_path('logs/debug/sql.log'),
            'level'  => env('LOG_LEVEL', 'debug'),
            'days'   => 14,
        ],
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步
  • 第二步
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档