记录 sql 查询日志
laravel 默认是不记录查询日志的,为了开发过程中 查看执行的sql日志,可以采用以下方式
### 事件监听
-
在 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 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
好像在哪见过 ?
@redrain 这个是 百度找到的
这样貌似更 “优雅“。
学习了 !!
foreach($event->bindings as $key =>$binding){ if($binding instanceof \DateTime){ $event->bindings[$key] = $binding->format('Y-m-d H:i:s'); } }
用passport后,数据库添加语句用到DateTime class 会报错
@moore0903 报错截图 提供下
@xufu
不需要调用
event(new QueryExecuted)
触发吗@kylesean 感觉这样确实比较优雅
为啥不用数据库的审计功能呢?代码层面实现有什么优势吗?