如何跟踪laravel 5中的每个用户数据库交互?

时间:2017-05-31 07:17:23

标签: php mysql laravel-5 activitylog

如果任何登录用户访问任何服务,那么我想跟踪该用户运行的所有查询。

示例:

如果user1登录并想要删除他的个人资料详细信息而user2想要更新他的个人资料详细信息,那么我想获取下表中的数据

user  |   user_id  |   service     |   query  
user1 |     1      | deleteProfile |   "DELETE FROM Users WHERE id=1"
user2 |     2      | updateProfile |   "UPDATE Users SET lastname='Thaper' WHERE id=2"

为此,我尝试使用antonioribeiro/trackerlaravel-activitylog等活动日志,但这与我的要求不符。

如何在Laravel 5.2中执行此操作?

1 个答案:

答案 0 :(得分:3)

您可以使用中间件执行此操作:

use DB;

class DatabaseLogger {

     public function handle($request, $next) {
          DB::connection()->enableQueryLog();
          return $next($request);
     }

     public function terminate($request, $response) {
         $queries = DB::getQueryLog();
         $id = Auth::check()?Auth::id():null;
         collect($queries)->each(function ($query) use ($id) { 
               DB::table("querylogtable")->insert(["user_id"=>$id,"query"=>$query]);
         });
     }

}

Kernel.php

中添加此中间件
protected $middleware = [  
    CheckForMaintenanceMode::class,
    DatabaseLogger::class           
];

请注意,如果进行了大量查询,将所有查询保留在内存中可能会很费力。

https://laravel.com/docs/5.0/database#query-logging

的更多信息

作为替代方案,您可以在服务提供商中注册以下内容:

   DB::listen(function ($query) {
        //code to log the query
    });

但请注意,记录查询也会触发此事件,从而导致无限递归日志记录,因此如果您执行此路由,请确保您不记录日志记录事件。

有关详情:https://laravel.com/docs/5.2/database#running-queries