记录 sql 查询日志

laravel 默认是不记录查询日志的,为了开发过程中 查看执行的sql日志,可以采用以下方式

### 事件监听 

  1.  在 app/Providers/EventServicePorvider.php 文件中 添加要注册的事件

    protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Database\Events\QueryExecuted' => [
            'App\Listeners\QueryListener',
        ],
        'Illuminate\Auth\Events\Login' => [
            'App\Listeners\LogSuccessfulLogin',
        ],
    
    ];

    2 进入cmd ,切换 项目根目录里,执行 命令

    php artisan event:generate

    3 . 编写 刚创建好的 QueryListener.php 代码如下

class QueryListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
        if($event->sql){
                    // 把sql  的日志独立分开
            $fileName = storage_path('logs/sql/'.date('Y-m-d').'.log'); 
            Log::useFiles($fileName,'info');
            $sql = str_replace("?", "'%s'", $event->sql);
            $log = vsprintf($sql, $event->bindings);
            Log::info($log);
        }

    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 12

@redrain 这个是 百度找到的

6年前 评论
if (env('APP_DEBUG') == true) {
            $sql = str_replace("?", "'%s'", $event->sql);
            $log = vsprintf($sql, $event->bindings); 
            (new Logger('sql'))->pushHandler(new RotatingFileHandler(storage_path('logs/sql.log')))->info($log);
        }

这样貌似更 “优雅“。

6年前 评论

学习了 !!

6年前 评论

foreach($event->bindings as $key =>$binding){ if($binding instanceof \DateTime){ $event->bindings[$key] = $binding->format('Y-m-d H:i:s'); } }
用passport后,数据库添加语句用到DateTime class 会报错

6年前 评论

@moore0903 报错截图 提供下

6年前 评论

不需要调用event(new QueryExecuted)触发吗

5年前 评论

@kylesean 感觉这样确实比较优雅

5年前 评论
山野村夫
DB::listen(function ($query) {
     $bindings = [];
     foreach ($query->bindings as $binding) {
          $bindings[] = $binding instanceof DateTime ? $binding->format('YYYY-MM-DD HH:mm:ss') : $binding;
     }

     Log::debug("[{$query->time}ms] " . str_replace_array('?', $bindings, $query->sql) . PHP_EOL);
});
5年前 评论
public function boot()
{
    if (env('APP_DEBUG') == true) {
        DB::listen(function ($query) {
            $sql = str_replace("?", "'%s'", $query->sql);
            $log = "[{$query->time}ms] " .vsprintf($sql, $query->bindings);
            Log::channel('daily_sql')->info($log);
        });
    }
}

    'daily_sql' => [//logging.php  配置文件配置频道
        'driver' => 'daily',
        'path' => storage_path('logs/sql.log'),
        'level' => 'debug',
        'days' => 10,
    ],
3年前 评论

为啥不用数据库的审计功能呢?代码层面实现有什么优势吗?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!