创建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);
}
}