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 相关文章推荐
PHP的面试题集
Nov 19 PHP
PHP5 面向对象程序设计
Feb 13 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
May 18 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
PHP读取xml方法介绍
Jan 12 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
PHP解压ZIP文件到指定文件夹的方法
Nov 17 PHP
PHP implode()函数用法讲解
Mar 08 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
Jun 06 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 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
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
Javascript模板技术
2007/04/27 Javascript
ext读取两种结构的xml的代码
2008/11/05 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
原生js实现购物车
2020/09/23 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
Python实现队列的方法
2015/05/26 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Django组件cookie与session的具体使用
2019/06/05 Python
python实现名片管理器的示例代码
2019/12/17 Python
Python while循环使用else语句代码实例
2020/02/07 Python
对python中return与yield的区别详解
2020/03/12 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
孝老爱亲事迹材料
2014/12/24 职场文书
应急管理工作总结2015
2015/05/04 职场文书
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python