如何跟踪laravel 5中的每个用户数据库交互?
问题描述:
如果任何登录用户访问任何服务,那么我想跟踪此用户运行的所有查询。如何跟踪laravel 5中的每个用户数据库交互?
例子:
如果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/tracker和laravel-activitylog等,但它与我的要求不符。
如何在Laravel 5.2中执行此操作?
答
你可以做到这一点使用中间件:
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
thanks apokryfos –