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 上传文件大小限制
Jul 05 PHP
PHP+MySQL 制作简单的留言本
Nov 02 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
php对数组排序代码分享
Feb 24 PHP
PHP模板解析类实例
Jul 09 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
php中define用法实例
Jul 30 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
php设计模式之单例模式代码
Jun 11 PHP
基于php判断客户端类型
Oct 14 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 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 shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
PHP运行模式汇总
2016/11/06 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
django session完成状态保持的方法
2018/11/27 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
财务会计应届生求职信
2013/11/24 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
担保书范本
2015/01/20 职场文书
初三化学教学反思
2016/02/22 职场文书