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实现维护文件代码
Jun 14 PHP
php不用正则采集速度探究总结
Mar 24 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
PHP用户验证和标签推荐的简单使用
Oct 31 PHP
php实现查询功能(数据访问)
May 23 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
thinkPHP框架中执行事务的方法示例
May 31 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与php MySQL 之间的关系
2009/07/17 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
php如何获取Http请求
2020/04/30 PHP
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python安装scipy的步骤解析
2019/09/28 Python
python新手学习使用库
2020/06/11 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
公司给客户的感谢信
2015/01/23 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
申请吧主发表的感言
2015/08/03 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis