laravel 监听sql语句,获取操作数据库的日志

 Laravel  2021-01-28  admin  1373  1853

创建监听类

App\Listeners\DbQueryExecutedListener

<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Session\Store;

/**
 * Class DbQueryExecutedListener.
 * @author http://code.cent123.com/
 */
class DbQueryExecutedListener
{
    protected $session;

    /**
     * Create the event listener.
     */
    public function __construct(Store $session)
    {
        $this->session = $session;
    }

    /**
     * Handle the event.
     */
    public function handle(QueryExecuted $event)
    {
        $id        = $this->session->get('id', 0);
        $arr_data  = $this->getSqlType($event);
        $this->writeSqlLog($event);

        file_put_contents('sqlListener.log', var_export($arr_data, true) . "\r\n", 8);
    }

    /**
     * @param $event
     * @return array
     */
    private function getSqlType($event)
    {
        $sql  = $event->sql;
        $type = substr($sql, 0, 6);
        switch ($type) {
            case 'delete':
            case 'select':
                $pattern = '/from `(\w+)`/';  //from `business_shop_level`
                preg_match($pattern, $sql, $match);
                $table = $match['1'] ?? '';

                break;
            case 'insert':
                $pattern = '/into `(\w+)`/';  //from `business_shop_level`
                preg_match($pattern, $sql, $match);
                $table = $match['1'] ?? '';

                break;
            case 'update':
                $pattern = '/update `(\w+)`/';  //from `business_shop_level`
                preg_match($pattern, $sql, $match);
                $table = $match['1'] ?? '';

                break;
            default:
                $table = '';
        }

        return [
            'type'  => $type,
            'table' => $table,
            'sql'   => $sql,
        ];
    }

    /**
     * @param $event
     * @return string
     */
    private function getExecutedSql($event)
    {
        $sql = str_replace('?', "'%s'", $event->sql);

        return vsprintf($sql, $event->bindings);
    }

    /**
     * @param $event
     */
    private function writeSqlLog($event)
    {
        $data = $this->getExecutedSql($event);
        $log  = date('/* Y-m-d H:i:s */') . '  ' . $data . ";\r\n";

        file_put_contents('sqlListener.sql', $log, 8);
    }

}

引入监听器

App\Providers\EventServiceProvider

namespace App\Providers;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [

        QueryExecuted::class => [
            'App\Listeners\DbQueryExecutedListener',
        ],
    ];

    /**
     * Register any events for your application.
     */
    public function boot()
    {
        parent::boot();
    }
}

在laravel中执行任何sql都会被监听到

如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


Systemd Web 管理系统:简化服务管理

# Systemd Web Systemd Web 是一个 Systemd 的 Web UI 管理系统,通过直观的界面和易用的操作,让用户能够轻松地管理 Linux 系统和服务。该项目旨在简化 Systemd 的使用,使得无论是专业的系统管理员还是普通的用户,都能够方便地对系统进行操作。 ## [github地址] (https://github.com/topascend/systemd

laravel 自定义写入日志

laravel 自定义写入日志if(!function_exists(&#39;myLog&#39;)){ /** *生成自定义文件日志内容 *@param$data *@paramstring$title *@parambool$isClear *@returnvoid *@Author:cent123.com */ functionmyLog($data,string$tit

systemctl 使用

Systemd是Linux系统工具,用来启动守护进程,已成为大多数发行版的标准配置。而systemctl是Systemd的主命令,用于管理系统。其实我们大部分服务都有使用systemctl管理,比如MySQL、Nginx等等。常见配置如下:[Unit] #单元描述 Description=GFAPP #在什么服务启动之后再执行本程序 After=mysql.service [Serv

封装 laravel 的公共队列,延迟处理任务

封装 laravel 的公共队列,延迟处理任务&lt;?php /** *ThisfileispartofLunanShopTeam. *http://code.cent123.com/ *@authorhttp://code.cent123.com/view/387 */ namespaceApp\Jobs; useException; useIlluminate\B