laravel记录SQL日志的新方法,使用Listener


<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

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

    /**
     * Handle the event.
     *
     * @param  QueryExecuted $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
        if (env('APP_ENV', 'production') == 'local') {
            try {
                $sql = str_replace("?", "'%s'", $event->sql);
                $params = json_decode(json_encode($event->bindings), true);
                $log = vsprintf($sql, $params);
                $dir = sprintf('%s/%s', storage_path('logs/api'), date('ymd'));
                $filename = sprintf('%s/%s/%s', storage_path('logs/api'), date('ymd'), 'sql.log');
                if (!is_dir($dir)) {
                    mkdir($dir, 0777);
                }
                $msg = '[' . date('Y-m-d H:i:s') . '] ' . $log . "\n";
                file_put_contents($filename, $msg, FILE_APPEND);
            } catch (\Exception $e) {

            }
            return $event;
        }
    }
}

这个是在线上也能用到的SQL记录,而且不需要更改vendor中的内容。文件在app/Listeners目录下。以下是官方的文档介绍:

Listeners 目录

默认情况下这个目录是不存在的,但如果你执行了 event:generate 或者 make:listener Artisan 命令时,它将会被创建出来。Listeners 目录包含 事件 的处理类。事件侦听器接收一个事件实例并执行逻辑以响应被触发的事件。例如,一个 UserRegistered 事件可能被 SendWelcomeEmail 侦听器处理。

https://learnku.com/docs/laravel/5.8/events/3917

以上是laravel对事件系统的介绍。

打赏作者

发表评论

电子邮件地址不会被公开。