【问题标题】:How to track every user database interaction in laravel 5?如何在 laravel 5 中跟踪每个用户数据库交互?
【发布时间】:2017-10-31 20:48:16
【问题描述】:

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

示例:

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

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

【问题讨论】:

    标签: php mysql laravel-5 activitylog


    【解决方案1】:

    您可以使用中间件来做到这一点:

    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

    【讨论】:

    • 在 Laravel 6 中,您可能希望将内核中的命名空间路径设置为 \App\Http\Middleware\DatabaseLogger::class
    猜你喜欢
    • 2013-09-17
    • 2020-06-16
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多