Laravel5中,监视查询SQL

创建event handler

写道
php artisan handler:event QueryLogTracker

 

QueryLogTracker.php

<?php

namespace App\Handlers\Events;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Log\Writer;
use Monolog\Logger as Monolog;
use App;

class QueryLogTracker
{
    protected $myLogger;
    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        $this->myLogger = new Writer( new Monolog( 'SQL log' ) );
        $this->myLogger->useFiles(App::storagePath().'/logs/sql.log' );
    }

    /**
     * Handle the event.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle($query, $bindings, $time, $name)
    {
            $data = compact( 'bindings', 'time', 'name' );
         
            // Format binding data for sql insertion
            foreach( $bindings as $i => $binding )
            {
                if( $binding instanceof \DateTime )
                {
                    $bindings[$i] = $binding->format( '\'Y-m-d H:i:s\'' );
                }
                else if( is_string( $binding ) )
                {
                    $bindings[$i] = "'$binding'";
                }
            }
         
            // Insert bindings into query
            $query = str_replace( array( '%', '?' ), array( '%%', '%s' ), $query );
            $query = vsprintf( $query, $bindings );
         
            $this->myLogger->info( $query, $data );
    }
}

 修改 EventServiceProvider.php

    protected $listen = [
        'App\Events\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
        'illuminate.query' => [
            'App\Handlers\Events\QueryLogTracker',
        ],
    ];

 

--------------------------------------------2015/12/29 更新-------------------------------------------------

最新版laravel5.2放出后,上面的例子将不再实用。

首先已经没有了php artisan handler:event这个命令,其次也没有了“illuminate.query”这个字符串事件。

实现方法更新为以下:

1.先在类EventServiceProvider中注册事件监听

 

    protected $listen = [
        'App\Events\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Database\Events\QueryExecuted' => [
            'App\Listeners\QueryLogTracker',
        ],
    ];
 2.执行以下命令,添加未创建的事件和监听器

 

写道
php artisan event:generate

 

3.编辑类QueryLogTracker

<?php

namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Log\Writer;
use Monolog\Logger as Monolog;
use App;

class QueryLogTracker
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        $this->myLogger = new Writer( new Monolog( 'SQL log' ) );
        $this->myLogger->useDailyFiles(App::storagePath().'/logs/sql.log' );
    }

    /**
     * Handle the event.
     *
     * @param  QueryExecuted  $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
            $sql = $event->sql;
            $time = $event->time;
            $bindings = $event->bindings;
            $name = $event->connectionName;
            $data = compact( 'bindings', 'time', 'name' );

            // Format binding data for sql insertion
            foreach( $bindings as $i => $binding )
            {
                if( $binding instanceof \DateTime )
                {
                    $bindings[$i] = $binding->format( '\'Y-m-d H:i:s\'' );
                }
                else if( is_string( $binding ) )
                {
                    $bindings[$i] = "'$binding'";
                }
            }

            // Insert bindings into query
            $query1 = str_replace( array( '%', '?' ), array( '%%', '%s' ), $sql );
            $query2 = vsprintf( $query1, $bindings );

            $this->myLogger->info( $query2.PHP_EOL, $data);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值