一、使用DB的listen方法:
请先看自定义日志方法:https://blog.youkuaiyun.com/hailanzi/article/details/102749510
1、在app/Listeners下新建文件QueryListener.php
namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
class QueryListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
public function handle(QueryExecuted $event)
{
$sql = str_replace("?", "'%s'", $event->sql);
$log['sql'] = vsprintf($sql, $event->bindings);
$log['time'] = $event->time;
$requestId = md5(time() . rand(1 , 1000));
$file = env('LOG_FILE_SQL_PATH') ? env('LOG_FILE_SQL_PATH') : storage_path('logs/sql.log');
$output = "[%datetime%][%channel%][requestId:{$requestId}][Level:%level_name%][Message:%message% %context% %extra%]\n";
(new \Monolog\Logger('sql'))->pushHandler((new RotatingFileHandler($file,env('LOG_MAXFILE', 5)))
->setFormatter(new LineFormatter($output, 'Y-m-d H:i:s', true, true)))
->info("query", $log);
}
}
2、在app/Providers/EventServiceProvider.php
在$listen 中加上
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener'
],
代码如下:
<?php
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\ExampleEvent' => [
'App\Listeners\ExampleListener',
],
// 加上这句话 执行sql语句
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener'
],
];
}
3、执行结果如下:
查看日志文档如下:
storage\logs\sql-2019-10-25.log
[2019-10-25 07:22:59][sql][requestId:e959ecfe460368b6fc34ad214fa67941][Level:INFO][Message:query {"sql":"select * from `tb_test` )","time":65.9} ]