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

本篇文章给大家带来了关于PHP的相关知识,其中主要根据示例来看一下使用中间件记录行为日志的问题,包括了使用日志通道暂存行为日志、使用定时任务将日志内容定时写入数据库等,下面一起来看...

本篇文章给大家带来了关于PHP的相关知识,其中主要根据示例来看一下使用中间件记录行为日志的问题,包括了使用日志通道暂存行为日志、使用定时任务将日志内容定时写入数据库等,下面一起来看一下,希望对大家有帮助。

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

一、定义中间件

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

phpthinkmake:middlewareBehavior

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

这个指令会 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,看能否生成以下文件.

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

打开文件,数据已写入

{"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次

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

产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;

日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉

本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;

部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入

如若转载,请注明出处:https://www.chanpinyuan.cn/28324.html;
(0)
上一篇 2022年12月1日 下午4:18
下一篇 2022年12月1日 下午4:18

相关推荐

发表回复

登录后才能评论
分享本页
返回顶部