Skip to content

Commit 8862a45

Browse files
committed
增加动态配置监听方法
1 parent 68a2a5f commit 8862a45

File tree

4 files changed

+74
-50
lines changed

4 files changed

+74
-50
lines changed

README.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# laravel-sql-monitor
2+
3+
4+
## 功能介绍
5+
6+
> 目前支持版本为: `laravle5.5~` `laravel6^`
7+
8+
##### 监控当前`页面功能`或者`接口`内执行的所有sql详细数据,以日志形式输出到laravel业务日志中(json方式写入日志)
9+
10+
- 监控的方法名称以 `sql_monitor_action:` 为前缀的方法路径
11+
- sql执行语句
12+
- sql执行参数
13+
- sql执行时长(ms为单位)
14+
- sql执行的的文件路径和文件内执行的行数
15+
16+
## 安装和配置
17+
18+
- 安装扩展,复制一下命令直接安装扩展包
19+
```
20+
composer require zanehy/laravel-sql-monitor
21+
```
22+
23+
- 配置,在 `/config/app.php` 文件内 `providers` 下增加以下配置
24+
```
25+
Zanehy\SqlMonitor\SqlMonitorServiceProvider::class,
26+
```
27+
28+
- 开启监听,以下三种配置中任意一种符合要求即可开启监听模式
29+
1. 配置 `env``APP_ENV``local`
30+
2. 配置 `env``APP_DEBUG``true`
31+
3. 新增 `env` 的配置 `MONITOR``true` (该种方式主要是为了兼容前两种配置在生产环境下需单独开启sql监听模式增加的一种独立开关配置)
32+
33+
- 日志打印和输出,日志字段解释
34+
* action: 当前访问的页面或者接口地址,以 `sql_monitor_action:` 为前缀
35+
* sql:当前方法执行的sql语句 使用 `?` 作为占位符
36+
* bindings: 当前sql使用到的参数,以数组形式展示,与上面sql中的占位符 `?` 依次对应
37+
* time: 当前sql语句执行的时间,毫秒 `ms` 为单位
38+
* file: 当期sql执行的文件名称(包含路径)
39+
* line: 当前sql在上文件中执行的行数
40+
41+
42+

config/monitor.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
*/
88

99
return [
10-
1110
'app' => env("APP_ENV", ''),
12-
'sql-monitor' => env("SQL_MONITOR", false),
11+
'debug' => env("APP_DEBUG", false),
12+
'sql-monitor' => env("MONITOR", false),
13+
'monitor-action' => env("MONITOR_ACTIONS", ""),
1314
];

src/SqlMonitoServiceProvider.php

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,30 @@ protected function mergeConfigFrom($path, $key)
6969
public function boot()
7070
{
7171

72-
if (($this->app['config']->get('monitor.app') == "local") || $this->app['config']->get('monitor.sql-monitor')) {
72+
if (($this->app['config']->get('monitor.app') == "local") || //开启配置APP_ENV配置为local启动
73+
$this->app['config']->get('monitor.debug') || //开启debug模式,默认自动启东监听
74+
$this->app['config']->get('monitor.sql-monitor')) //开启配置SQL_MONITOR配置为true启动(为不影响APP_ENV和APP_DEBUG配置,单独设置sql监控的开启配置)
75+
{
76+
77+
//获取当前访问的路径地址和要匹配的路由,进行匹配指定的监控路径
78+
$urlPath = Request::capture()->path();
79+
$monitorActions = $this->app['config']->get('monitor.monitor-action');
80+
$monitorActions = array_unique(array_filter(explode("|", $monitorActions)));
81+
if (empty($urlPath) || empty($monitorActions)) {
82+
return true;
83+
}
84+
85+
//匹配当前的路径是否在配置的路径中
86+
$matching = false;
87+
foreach ($monitorActions as $monitorAction) {
88+
if (strstr(trim($urlPath), trim($monitorAction))) {
89+
$matching = true;
90+
break;
91+
}
92+
}
93+
if (!$matching) {
94+
true;
95+
}
7396

7497
$db = $this->app['db'];
7598
$db->listen(
@@ -89,8 +112,6 @@ function ($query) {
89112
}
90113
}
91114

92-
93-
94115
/**
95116
* 监听
96117
* @auther zhanghy<[email protected]>
@@ -99,8 +120,8 @@ function ($query) {
99120
*/
100121
private function sqlMonitor(QueryExecuted $event, array $stacks)
101122
{
102-
$sql = str_replace("?", "'%s'", $event->sql);
103-
$sql = vsprintf($sql, $event->bindings);
123+
// $sql = str_replace("?", "'%s'", $event->sql);
124+
// $sql = vsprintf($sql, $event->bindings);
104125
$urlPath = Request::capture()->path();
105126

106127
//检索执行的文件和行数
@@ -115,9 +136,9 @@ private function sqlMonitor(QueryExecuted $event, array $stacks)
115136

116137
//记录日志
117138
Log::info(json_encode([
118-
'action' => 'sqlmonitor:'. $urlPath,
119-
'path' => $urlPath,
120-
'sql' => $sql,
139+
'action' => 'sql_monitor_action:'. $urlPath,
140+
'sql' => $event->sql,
141+
'bindings' => $event->bindings,
121142
'time' => $event->time . 'ms',
122143
'file' => ($res['file'] ?? ''),
123144
'line' => ($res['line'] ?? '')

src/SqlMonitor.php

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)