thinkphp6如何使用中間件記錄行為日志
前言
發(fā)現(xiàn)本站沒(méi)有一個(gè)靠譜的tp6記錄行為日志的教程,于是就整理了一下自己在項(xiàng)目中已經(jīng)投入使用的行為日志中間件的詳細(xì)配置步驟供大家參考
提示:先閱讀官方中間件教程 https://www.kancloud.cn/manual/thinkphp6_0/1037493
中間件
一、定義中間件
可以通過(guò)命令行指令快速生成中間件
php think make:middleware Behavior
這個(gè)指令會(huì) app/middleware目錄下面生成一個(gè)Behavior中間件。
內(nèi)容如下:
<?php declare (strict_types = 1); namespace app\middleware; use think\facade\Log; class Behavior { /** * 處理請(qǐng)求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //start 加入以下內(nèi)容 $admin = get_admin_info(); //當(dāng)前登錄用戶(hù)的信息,自己實(shí)現(xiàn) $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'], //操作人用戶(hù)名 'route' => $route, //操作的路由地址 'method' => $method, //get/post 'req_tp' => $is_ajax ? 'ajax' : 'normal', 'req_data' => $req_data, //get/post的數(shù)據(jù) 'ip' => getIp(), 'create_time' => time() ]; //end return $next($request); } }
二、使用日志通道暫存行為日志
不建議將行為日志實(shí)時(shí)寫(xiě)入數(shù)據(jù)庫(kù)給數(shù)據(jù)庫(kù)造成不必要的壓力. 我們先寫(xiě)入log文件緩存,定時(shí)存入數(shù)據(jù)庫(kù)
提示:先閱讀官方日志處理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
日志處理
1.修改log配置文件
打開(kāi)config/log.php ,在’channels’ => [] 最后加入一個(gè)記錄行為日志的單獨(dú)通道:
// 其它日志通道配置 //行為日志 'behavior' => [ 'path' => runtime_path().'behavior', //日志存放目錄 'type' => 'File', 'single' => 'b', //單一文件日志:文件名 'file_size' => 1024*1024*10, //日志文件大小限制(超出會(huì)生成多個(gè)文件 'max_files' => 30, //文件最大數(shù)量 'realtime_write' => false, // 關(guān)閉實(shí)時(shí)寫(xiě)入 ],
2.注冊(cè)全局中間件
打開(kāi)app/middleware.php ,注冊(cè)個(gè)行為日志全局中間件
<?php // 全局中間件定義文件 return [ // 全局請(qǐng)求緩存 // \think\middleware\CheckRequestCache::class, // 多語(yǔ)言加載 // \think\middleware\LoadLangPack::class, // Session初始化 // \think\middleware\SessionInit::class // 行為日志 \app\middleware\Behavior::class, ];
3.測(cè)試能否成功生成日志
隨便訪問(wèn)一個(gè)本項(xiàng)目頁(yè)面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下文件.
打開(kāi)文件,數(shù)據(jù)已寫(xiě)入
{“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}"}
三、使用定時(shí)任務(wù)將日志內(nèi)容定時(shí)寫(xiě)入數(shù)據(jù)庫(kù)
1.新建一個(gè)api方法
要求定時(shí)任務(wù)可以訪問(wèn)到
/** * 定時(shí)任務(wù)服務(wù)器定時(shí)將用戶(hù)行為日志插入到數(shù)據(jù)庫(kù) * @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); //批量插入數(shù)據(jù)庫(kù) file_put_contents($path, ''); //清空文件日志 echo '采集用戶(hù)行為日志成功' . count($d); } catch (DbException $e) { echo ($e->getMessage()); } } }
2.新建行為日志數(shù)據(jù)表log_behavior
SET 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 '用戶(hù)id', `admin_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶(hù)名', `route` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模塊名稱(chēng)', `method` enum('delete','put','post','get') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'get' COMMENT '請(qǐng)求方式 1get 2post 3put 4delete', `req_data` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '請(qǐng)求數(shù)據(jù)', `ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶(hù)ip', `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時(shí)間', 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.新建定時(shí)任務(wù)
新建定時(shí)任務(wù),定時(shí)訪問(wèn)步驟1的sync_behavior_log地址就行了, 建議5分鐘1次
至此, 有用戶(hù)訪問(wèn)時(shí),數(shù)據(jù)表就會(huì)每隔一段時(shí)間就批量插入行為日志數(shù)據(jù)了
總結(jié)
寫(xiě)得比較簡(jiǎn)單粗暴, 有些地方需要自己實(shí)現(xiàn), 比如獲取登錄用戶(hù)信息…
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 關(guān)于Thinkphp6的日志問(wèn)題
- Thinkphp6.0中間件的具體使用
- ThinkPHP6.0前置、后置中間件區(qū)別
- thinkphp6使用mysql悲觀鎖解決商品超賣(mài)問(wèn)題的實(shí)現(xiàn)
- phpstorm遠(yuǎn)程連接服務(wù)器并實(shí)時(shí)更新發(fā)布代碼(thinkphp6.0.7)
- ThinkPHP6.0 重寫(xiě)URL去掉Index.php的解決方法
- ThinkPHP6通過(guò)Ucenter實(shí)現(xiàn)注冊(cè)登錄的示例代碼
- ThinkPHP6.0如何利用自定義驗(yàn)證規(guī)則規(guī)范的實(shí)現(xiàn)登陸
- 讓whoops幫我們告別ThinkPHP6的異常頁(yè)面
- 基于thinkphp6.0的success、error實(shí)現(xiàn)方法
- 使用composer安裝使用thinkphp6.0框架問(wèn)題【視頻教程】
- 寶塔中ThinkPHP框架使用Redis的一系列教程
- thinkphp6中Redis 的基本使用方法詳解
相關(guān)文章
php微信公眾平臺(tái)開(kāi)發(fā)(三)訂閱事件處理
這篇文章主要介紹了php微信公眾平臺(tái)開(kāi)發(fā)中的訂閱事件處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Laravel 修改默認(rèn)日志文件名稱(chēng)和位置的例子
今天小編就為大家分享一篇Laravel 修改默認(rèn)日志文件名稱(chēng)和位置的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10thinkPHP+LayUI 流加載實(shí)現(xiàn)功能
這篇文章主要介紹了thinkPHP+LayUI 流加載實(shí)現(xiàn)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09php添加數(shù)據(jù)到xml文件的簡(jiǎn)單例子
下面小編就為大家?guī)?lái)一篇php添加數(shù)據(jù)到xml文件的簡(jiǎn)單例子。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09PHP的switch判斷語(yǔ)句的“高級(jí)”用法詳解
這篇文章主要介紹了PHP的switch判斷語(yǔ)句的“高級(jí)”用法詳解,其實(shí)本文講解的還是它的基礎(chǔ)用法,需要的朋友可以參考下2014-10-10關(guān)于PHP中字符串與多進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇關(guān)于PHP中字符串與多進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11PHP執(zhí)行系統(tǒng)命令函數(shù)實(shí)例講解
這篇文章主要介紹了PHP執(zhí)行系統(tǒng)命令函數(shù)實(shí)例講解,列舉的都是一些常用的函數(shù),有感興趣的同學(xué)可以學(xué)習(xí)下2021-03-03PHP實(shí)現(xiàn)WebSocket實(shí)例詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)WebSocket實(shí)例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09