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如何用中间件记录行为日志”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。
推荐阅读
-
如何快速解决ThinkPHP5.1出现MISS缓存未命中问题
如何快速解决ThinkPHP5.1出现MISS缓存未命中问题这篇文...
-
thinkphp 6.0 swoole扩展websocket使用教程
-
PHP之ThinkPHP框架,让你10分钟快速入门,还免费包教会哟
-
ThinkPHP5.0目录结构,作用及其初略说明
-
Thinkphp在IIS7.5里的伪静态代码,亲测,收藏
-
哪些PHP开源作品值得关注
-
开源学校教务管理系统
-
一次项目中Thinkphp绕过禁用函数的实战记录
-
thinkphp3.1与3.2的区别有哪些
thinkphp3.1与3.2的区别有哪些今天小编给大家分享一下t...
-
thinkphp中的orm是什么
thinkphp中的orm是什么这篇文章主要介绍“thinkphp...