Laravel给生产环境添加监听事件(SQL日志监听)


Posted in PHP onJune 19, 2017

本文主要给大家介绍的是关于Laravel给生产环境添加监听事件(SQL日志监听)的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

laravel版本:5.2.*

一、创建监听器

php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted

or

sudo /usr/local/bin/php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted

会自动生成文件 app/Listeners/QueryListener.php

二、注册事件

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 Illuminate\Database\Events\QueryExecuted 事件的监听器为 QueryListener

protected $listen = [ 
 'Illuminate\Database\Events\QueryExecuted' => [
  'App\Listeners\QueryListener',
 ],
];

最终代码如下

namespace App\Providers;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
 /**
  * The event listener mappings for the application.
  *
  * @var array
  */
 protected $listen = [
  'App\Events\SomeEvent' => [
   'App\Listeners\EventListener',
  ],
  'Illuminate\Database\Events\QueryExecuted' => [
   'App\Listeners\QueryListener',
  ],
 ];
 /**
  * Register any other events for your application.
  *
  * @param \Illuminate\Contracts\Events\Dispatcher $events
  * @return void
  */
 public function boot(DispatcherContract $events)
 {
  parent::boot($events);
  //
 }
}

三、添加逻辑

打开 app/Listeners/QueryListener.php

光有一个空的监听器是不够的,我们需要自己实现如何把 $sql 记录到日志中。为此,对 QueryListener 进行改造,完善其 handle 方法如下:

$sql = str_replace("?", "'%s'", $event->sql);
$log = vsprintf($sql, $event->bindings);
Log::info($log);

最终代码如下

namespace App\Listeners;
use Log;
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)
 {
  $sql = str_replace("?", "'%s'", $event->sql);
  $log = vsprintf($sql, $event->bindings);
  Log::info($log);
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
帖几个PHP的无限分类实现想法~
Jan 02 PHP
php htmlspecialchars加强版
Feb 16 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 #PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 #PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 #PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 #PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 #PHP
PHP利用Socket获取网站的SSL证书与公钥
Jun 18 #PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 #PHP
You might like
深入理解php的MySQL连接类
2013/06/07 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
Django内容增加富文本功能的实例
2017/10/17 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python Flask基础教程示例代码
2018/02/07 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python能做什么 python的含义
2019/10/12 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
巴基斯坦购物网站:Goto
2019/03/11 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
new修饰符是起什么作用
2015/06/28 面试题
2016年公务员六五普法心得体会
2016/01/21 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js