Home > Article > PHP Framework > Example analysis: how thinkphp uses middleware to record behavior logs
This article brings you relevant knowledge about PHP. It mainly looks at the problem of using middleware to record behavior logs based on examples, including using log channels to temporarily store behavior logs, using Scheduled tasks regularly write log content to the database, etc. Let’s take a look at it. I hope it will be helpful to everyone.
##Recommended study: "PHP Video Tutorial"
php think make:middleware Behavior
This instruction will generate a Behavior middleware under the app/middleware directory. The content is as follows:
<?phpdeclare (strict_types = 1);namespace app\middleware;use think\facade\Log;class Behavior{ /** * 处理请求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //start 加入以下内容 $admin = get_admin_info(); //当前登录用户的信息,自己实现 $method = strtolower($request->method()); $is_ajax = $request->isAjax(); $route = $request->pathinfo(); $req = $_REQUEST; unset($req['s'],$req['_session']); $req_data = $req ? json_encode($req) : ''; $data = [ 'admin_id' => $admin['id'], //操作人id 'admin_user' => $admin['user'], //操作人用户名 'route' => $route, //操作的路由地址 'method' => $method, //get/post 'req_tp' => $is_ajax ? 'ajax' : 'normal', 'req_data' => $req_data, //get/post的数据 'ip' => getIp(), 'create_time' => time() ]; //end return $next($request); }}2. Use the log channel to temporarily store behavior logs It is not recommended to write behavior logs to the database in real time to cause unnecessary pressure on the database. We first write the log file cache, Scheduled storage into the database
Tips: Read the official log processing tutorial first https://www.kancloud.cn/manual/thinkphp6_0/1037616Log processing
Open config/log.php, add a separate channel for recording behavior logs at the end of 'channels' => []:2. Register global middleware// 其它日志通道配置 //行为日志 'behavior' => [ 'path' => runtime_path().'behavior', //日志存放目录 'type' => 'File', 'single' => 'b', //单一文件日志:文件名 'file_size' => 1024*1024*10, //日志文件大小限制(超出会生成多个文件 'max_files' => 30, //文件最大数量 'realtime_write' => false, // 关闭实时写入 ],
Open app/middleware.php and register a behavior log global middleware3. Test whether the log can be successfully generatedVisit any page of this project, for example: http://www.tp6.com/index/index/test?a=1&b=2, and see if the following files can be generated.<?php // 全局中间件定义文件return [ // 全局请求缓存 // \think\middleware\CheckRequestCache::class, // 多语言加载 // \think\middleware\LoadLangPack::class, // Session初始化 // \think\middleware\SessionInit::class // 行为日志 \app\middleware\Behavior::class, ];
Open the file ,The data has been written
{"time":"2022-04-16T21:38:48 08:00","type":"info","msg":"{"admin_id ":888,"admin_user":"fanchen","route":"index\/index\/test","method":"get","req_tp":"normal","req_data":"{\" a\":\"1\",\"b\":\"2\"}","ip":"127.0.0.1","create_time":1650116328}"}
/** * 定时任务服务器定时将用户行为日志插入到数据库 * @return void */ public function sync_behavior_log() { $path = runtime_path() . 'behavior/b.log'; $b_file = file_get_contents($path); $b_arr = explode(PHP_EOL, $b_file); $d = []; foreach ($b_arr as $b) { $data = json_decode($b, true); if (!empty($data['msg'])) { $d[] = json_decode($data['msg'], true); } } if ($d) { try { Db::name('log_behavior')->insertAll($d); //批量插入数据库 file_put_contents($path, ''); //清空文件日志 echo '采集用户行为日志成功' . count($d); } catch (DbException $e) { echo ($e->getMessage()); } } }
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for log_behavior -- ---------------------------- DROP TABLE IF EXISTS `log_behavior`; CREATE TABLE `log_behavior` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户id', `admin_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户名', `route` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模块名称', `method` enum('delete','put','post','get') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'get' COMMENT '请求方式 1get 2post 3put 4delete', `req_data` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '请求数据', `ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户ip', `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, INDEX `uid`(`admin_id`) USING BTREE, INDEX `admin_user`(`admin_user`) USING BTREE, INDEX `route`(`route`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3902195 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '行为日志' ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;
PHP Video Tutorial"
The above is the detailed content of Example analysis: how thinkphp uses middleware to record behavior logs. For more information, please follow other related articles on the PHP Chinese website!