欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年03月24日 08:33:45   作者:字節(jié)舞動(dòng)  
這篇文章主要介紹了thinkphp6如何使用中間件記錄行為日志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

發(fā)現(xiàn)本站沒(méi)有一個(gè)靠譜的tp6記錄行為日志的教程,于是就整理了一下自己在項(xiàng)目中已經(jīng)投入使用的行為日志中間件的詳細(xì)配置步驟供大家參考

提示:先閱讀官方中間件教程 https://www.kancloud.cn/manual/thinkphp6_0/1037493

中間件

一、定義中間件

可以通過(guò)命令行指令快速生成中間件

php think make:middleware Behavior

在這里插入圖片描述

這個(gè)指令會(huì) app/middleware目錄下面生成一個(gè)Behavior中間件。

內(nèi)容如下:

<?php
declare (strict_types = 1);
namespace app\middleware;
use think\facade\Log;

class Behavior
{
    /**
     * 處理請(qǐng)求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
         //start 加入以下內(nèi)容
         $admin  =  get_admin_info();   				//當(dāng)前登錄用戶(hù)的信息,自己實(shí)現(xiàn)
         $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'],			//操作人用戶(hù)名
               'route' => $route,						//操作的路由地址
               'method' => $method,						//get/post
               'req_tp' => $is_ajax ? 'ajax' : 'normal',
               'req_data' => $req_data,   				 //get/post的數(shù)據(jù)
               'ip' => getIp(),
               'create_time' => time()
         ];
         //end
         return $next($request);
    }
}

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

不建議將行為日志實(shí)時(shí)寫(xiě)入數(shù)據(jù)庫(kù)給數(shù)據(jù)庫(kù)造成不必要的壓力. 我們先寫(xiě)入log文件緩存,定時(shí)存入數(shù)據(jù)庫(kù)

提示:先閱讀官方日志處理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616

日志處理

1.修改log配置文件

打開(kāi)config/log.php ,在’channels’ => [] 最后加入一個(gè)記錄行為日志的單獨(dú)通道:

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

2.注冊(cè)全局中間件

打開(kāi)app/middleware.php ,注冊(cè)個(gè)行為日志全局中間件

<?php
// 全局中間件定義文件
return [
    // 全局請(qǐng)求緩存
    // \think\middleware\CheckRequestCache::class,
    // 多語(yǔ)言加載
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    // \think\middleware\SessionInit::class
    // 行為日志
    \app\middleware\Behavior::class,   
];

3.測(cè)試能否成功生成日志

隨便訪問(wèn)一個(gè)本項(xiàng)目頁(yè)面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下文件.

在這里插入圖片描述

打開(kāi)文件,數(shù)據(jù)已寫(xiě)入

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

三、使用定時(shí)任務(wù)將日志內(nèi)容定時(shí)寫(xiě)入數(shù)據(jù)庫(kù)

1.新建一個(gè)api方法

要求定時(shí)任務(wù)可以訪問(wèn)到

 /**
     * 定時(shí)任務(wù)服務(wù)器定時(shí)將用戶(hù)行為日志插入到數(shù)據(jù)庫(kù)
     * @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);     //批量插入數(shù)據(jù)庫(kù)
                file_put_contents($path, '');       //清空文件日志
                echo '采集用戶(hù)行為日志成功' . count($d);
            } catch (DbException $e) {
                echo ($e->getMessage());
            }
        }
    }

2.新建行為日志數(shù)據(jù)表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 '用戶(hù)id',
  `admin_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶(hù)名',
  `route` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模塊名稱(chēng)',
  `method` enum('delete','put','post','get') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'get' COMMENT '請(qǐng)求方式 1get 2post 3put 4delete',
  `req_data` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '請(qǐng)求數(shù)據(jù)',
  `ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶(hù)ip',
  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時(shí)間',
  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.新建定時(shí)任務(wù)

新建定時(shí)任務(wù),定時(shí)訪問(wèn)步驟1的sync_behavior_log地址就行了, 建議5分鐘1次

至此, 有用戶(hù)訪問(wèn)時(shí),數(shù)據(jù)表就會(huì)每隔一段時(shí)間就批量插入行為日志數(shù)據(jù)了

總結(jié)

寫(xiě)得比較簡(jiǎn)單粗暴, 有些地方需要自己實(shí)現(xiàn), 比如獲取登錄用戶(hù)信息…

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論