實例解析thinkphp怎么用中間件記錄行為日志

本篇文章給大家帶來了關于php的相關知識,其中主要根據示例來看一下使用中間件記錄行為日志的問題,包括了使用日志通道暫存行為日志、使用定時任務將日志內容定時寫入數據庫等,下面一起來看一下,希望對大家有幫助。

實例解析thinkphp怎么用中間件記錄行為日志

推薦學習:《php

一、定義中間件

可以通過命令行指令快速生成中間件

php think make:middleware Behavior

實例解析thinkphp怎么用中間件記錄行為日志
這個指令會 app/middleware目錄下面生成一個Behavior中間件。內容如下:

立即學習PHP免費學習筆記(深入)”;

<?phpdeclare (strict_types = 1);namespace appmiddleware;use thinkfacadeLog;class Behavior{     /**      * 處理請求      *      * @param thinkRequest $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);     }}

二、使用日志通道暫存行為日志

不建議將行為日志實時寫入數據庫給數據庫造成不必要的壓力. 我們先寫入log文件緩存,定時存入數據庫
提示:先閱讀官方日志處理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
日志處理

1.修改log配置文件

打開config/log.php ,在’channels’ => [] 最后加入一個記錄行為日志的單獨通道:

 // 其它日志通道配置  //行為日志  'behavior'    =>    [      'path'           => runtime_path().'behavior',  //日志存放目錄      'type'    =>    'File',      'single' =>     'b',        		//單一文件日志:文件名      'file_size'   	=> 	1024*1024*10, 	//日志文件大小限制(超出會生成多個文件      'max_files' => 30,                  //文件最大數量      'realtime_write'    =>    false,    // 關閉實時寫入  ],

2.注冊全局中間件

打開app/middleware.php ,注冊個行為日志全局中間件

<?php// 全局中間件定義文件return [     // 全局請求緩存     // thinkmiddlewareCheckRequestCache::class,     // 多語言加載     // thinkmiddlewareLoadLangPack::class,     // Session初始化     // thinkmiddlewareSessionInit::class     // 行為日志     appmiddlewareBehavior::class,   ];

3.測試能否成功生成日志

隨便訪問一個本項目頁面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下文件.
實例解析thinkphp怎么用中間件記錄行為日志
打開文件,數據已寫入

{“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}”}


三、使用定時任務將日志內容定時寫入數據庫

1.新建一個api方法, 要求定時任務可以訪問到

 /**      * 定時任務服務器定時將用戶行為日志插入到數據庫      * @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());             }         }     }

2.新建行為日志數據表log_behavior

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;

3.新建定時任務

新建定時任務,定時訪問步驟1的sync_behavior_log地址就行了, 建議5分鐘1次

至此, 有用戶訪問時,數據表就會每隔一段時間就批量插入行為日志數據了

推薦學習:《php

以上就是實例解析

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享