中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

thinkphp6如何使用中間件記錄行為日志

發布時間:2023-03-25 16:17:56 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

這篇“thinkphp6如何使用中間件記錄行為日志”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“thinkphp6如何使用中間件記錄行為日志”文章吧。

    一、定義中間件

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

    php think make:middleware Behavior

    thinkphp6如何使用中間件記錄行為日志

    這個指令會 app/middleware目錄下面生成一個Behavior中間件。

    內容如下:

    <?php
    declare (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);
        }
    }

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

    不建議將行為日志實時寫入數據庫給數據庫造成不必要的壓力. 我們先寫入log文件緩存,定時存入數據庫

    1.修改log配置文件

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

     // 其它日志通道配置
     //行為日志
     '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 [
        // 全局請求緩存
        // \think\middleware\CheckRequestCache::class,
        // 多語言加載
        // \think\middleware\LoadLangPack::class,
        // Session初始化
        // \think\middleware\SessionInit::class
        // 行為日志
        \app\middleware\Behavior::class,   
    ];

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

    隨便訪問一個本項目頁面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下文件.

    thinkphp6如何使用中間件記錄行為日志

    打開文件,數據已寫入

    {“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次

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

    以上就是關于“thinkphp6如何使用中間件記錄行為日志”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    苏尼特左旗| 桦甸市| 茌平县| 德令哈市| 连云港市| 桓仁| 大化| 铜山县| 疏附县| 铁力市| 介休市| 阜康市| 桐梓县| 通江县| 邹平县| 临安市| 惠来县| 右玉县| 贡觉县| 阳信县| 平凉市| 益阳市| 池州市| 长治市| 朔州市| 金坛市| 吉水县| 麻阳| 乌拉特中旗| 临潭县| 南通市| 临颍县| 维西| 万安县| 灌云县| 仲巴县| 聂拉木县| 都安| 二连浩特市| 尉氏县| 灵璧县|