如果任何登录用户访问任何服务,那么我想跟踪该用户运行的所有查询。
示例:
如果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中执行此操作?
答案 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
});
但请注意,记录查询也会触发此事件,从而导致无限递归日志记录,因此如果您执行此路由,请确保您不记录日志记录事件。