您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

实例解析thinkphp怎么用中间件记录行为日志

2024/4/26 10:25:38发布5次查看
本篇文章给大家带来了关于php的相关知识,其中主要根据示例来看一下使用中间件记录行为日志的问题,包括了使用日志通道暂存行为日志、使用定时任务将日志内容定时写入数据库等,下面一起来看一下,希望对大家有帮助。
推荐学习:《php视频教程》
一、定义中间件可以通过命令行指令快速生成中间件
php think make:middleware behavior
这个指令会 app/middleware目录下面生成一个behavior中间件。内容如下:
<?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);    }}
二、使用日志通道暂存行为日志不建议将行为日志实时写入数据库给数据库造成不必要的压力. 我们先写入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方法, 要求定时任务可以访问到 /** * 定时任务服务器定时将用户行为日志插入到数据库 * @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_behaviorset 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视频教程》
以上就是实例解析thinkphp怎么用中间件记录行为日志的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录