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 全文搜索 技巧
Apr 27 PHP
php 魔术函数使用说明
Feb 21 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
Apr 28 PHP
PHPUnit PHP测试框架安装方法
Mar 23 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
php上传excel表格并获取数据
Apr 27 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实现简单洗牌算法
2013/06/18 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
python3实现暴力穷举博客园密码
2016/06/19 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python opencv调用笔记本摄像头
2019/08/28 Python
python实现猜单词游戏
2020/05/22 Python
python logging模块的使用详解
2020/10/23 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
你对IPv6了解程度
2016/02/09 面试题
介绍一下Ruby的特点
2013/01/20 面试题
演讲稿的写法
2014/05/19 职场文书
文明寝室标语
2014/06/13 职场文书
建筑工地文明标语
2014/10/09 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python