文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

thinkphp如何用中间件记录行为日志

2023-06-30 14:50

关注

这篇“thinkphp如何用中间件记录行为日志”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“thinkphp如何用中间件记录行为日志”文章吧。

一、定义中间件

可以通过命令行指令快速生成中间件

php think make:middleware Behavior


这个指令会 app/middleware目录下面生成一个Behavior中间件。内容如下:

<?phpdeclare (strict_types = 1);namespace app\middleware;use think\facade\Log;class Behavior{        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 [    // 全局请求缓存    // \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,看能否生成以下文件.

打开文件,数据已写入

{“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方法, 要求定时任务可以访问到

     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次

至此, 有用户访问时,数据表就会每隔一段时间就批量插入行为日志数据了

以上就是关于“thinkphp如何用中间件记录行为日志”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯