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

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

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

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

一、定义中间件

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

phpthinkmake:middlewareBehavior


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

<?phpdeclare(strict_types=1);namespaceapp\middleware;usethink\facade\Log;classBehavior{/***处理请求**@param\think\Request$request*@param\Closure$next*@returnResponse*/publicfunctionhandle($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()];//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 ,注册个行为日志全局中间件

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

/***定时任务服务器定时将用户行为日志插入到数据库*@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如何用中间件记录行为日志”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。

发布于 2022-05-19 10:37:13
收藏
分享
海报
0 条评论
20
上一篇:android怎么实现多点触摸应用 下一篇:SpringBoot定时任务功能怎么实现
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码