4

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

例子:

如果 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 中做到这一点?

4

1 回答 1

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

于 2017-05-31T07:53:11.267 回答