thinkphp如何用中间件记录行为日志-mile米乐体育
thinkphp如何用中间件记录行为日志
这篇“thinkphp如何用中间件记录行为日志”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“thinkphp如何用中间件记录行为日志”文章吧。
一、定义中间件
可以通过命令行指令快速生成中间件
phpthinkmake:middlewarebehavior
这个指令会 app/middleware目录下面生成一个behavior中间件。内容如下:
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()];//endreturn$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 ,注册个行为日志全局中间件
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方法, 要求定时任务可以访问到
/***定时任务服务器定时将用户行为日志插入到数据库*@returnvoid*/publicfunctionsync_behavior_log(){$path=runtime_path().'behavior/b.log';$b_file=file_get_contents($path);$b_arr=explode(php_eol,$b_file);$d=[];foreach($b_arras$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
setnamesutf8mb4;setforeign_key_checks=0;--------------------------------tablestructureforlog_behavior------------------------------droptableifexists`log_behavior`;createtable`log_behavior`(`id`int(10)unsignednotnullauto_incrementcomment'id',`admin_id`int(11)notnulldefault0comment'用户id',`admin_user`varchar(50)charactersetutf8collateutf8_general_cinotnulldefault''comment'用户名',`route`varchar(50)charactersetutf8collateutf8_general_cinulldefaultnullcomment'模块名称',`method`enum('delete','put','post','get')charactersetutf8collateutf8_general_cinulldefault'get'comment'请求方式1get2post3put4delete',`req_data`varchar(300)charactersetutf8collateutf8_general_cinotnulldefault''comment'请求数据',`ip`varchar(20)charactersetutf8collateutf8_general_cinotnulldefault''comment'用户ip',`create_time`int(11)notnulldefault0comment'创建时间',primarykey(`id`)usingbtree,index`uid`(`admin_id`)usingbtree,index`admin_user`(`admin_user`)usingbtree,index`route`(`route`)usingbtree)engine=innodbauto_increment=3902195characterset=utf8collate=utf8_general_cicomment='行为日志'row_format=compact;setforeign_key_checks=1;3.新建定时任务
新建定时任务,定时访问步骤1的sync_behavior_log地址就行了, 建议5分钟1次
至此, 有用户访问时,数据表就会每隔一段时间就批量插入行为日志数据了
以上就是关于“thinkphp如何用中间件记录行为日志”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
展开全文