laravel框架记录监听sql语句,并且打印到日志文件中

 1 添加到服务容器AppServiceProvider.php 
 2 boot 方法中
 3 if (env('APP_ENV') != 'production') {
 4             \DB::listen(
 5                 function ($sql) {
 6                     foreach ($sql->bindings as $i => $binding) {
 7                         if ($binding instanceof \DateTime) {
 8                             $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
 9                         } else {
10                             if (is_string($binding)) {
11                                 $sql->bindings[$i] = "'$binding'";
12                             }
13                         }
14                     }
15 
16                     // Insert bindings into query
17                     $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
18 
19                     $query = vsprintf($query, $sql->bindings);
20 
21                     // Save the query to file
22                     $logFile = fopen(
23                         storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'),
24                         'a+'
25                     );
26                     fwrite($logFile, date('Y-m-d H:i:s') . ': ' . $query . PHP_EOL);
27                     fclose($logFile);
28                 }
29             );
30         }

可以在执行查询的时候,记录下所有连锁查询的sql语句,便于排查性能和查找问题

posted on 2021-06-10 10:22  kevin_yang123  阅读(282)  评论(0编辑  收藏  举报