thinkphp6如何使用中間件記錄行為日志
前言
發(fā)現(xiàn)本站沒有一個靠譜的tp6記錄行為日志的教程,于是就整理了一下自己在項目中已經(jīng)投入使用的行為日志中間件的詳細配置步驟供大家參考
提示:先閱讀官方中間件教程 https://www.kancloud.cn/manual/thinkphp6_0/1037493
中間件
一、定義中間件
可以通過命令行指令快速生成中間件
php think make:middleware Behavior

這個指令會 app/middleware目錄下面生成一個Behavior中間件。
內容如下:
<?php
declare (strict_types = 1);
namespace app\middleware;
use think\facade\Log;
class Behavior
{
/**
* 處理請求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
//start 加入以下內容
$admin = get_admin_info(); //當前登錄用戶的信息,自己實現(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'], //操作人用戶名
'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ù)據(jù)庫給數(shù)據(jù)庫造成不必要的壓力. 我們先寫入log文件緩存,定時存入數(shù)據(jù)庫
提示:先閱讀官方日志處理教程 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, //文件最大數(shù)量
'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,看能否生成以下文件.

打開文件,數(shù)據(jù)已寫入
{“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ù)據(jù)庫
1.新建一個api方法
要求定時任務可以訪問到
/**
* 定時任務服務器定時將用戶行為日志插入到數(shù)據(jù)庫
* @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ù)庫
file_put_contents($path, ''); //清空文件日志
echo '采集用戶行為日志成功' . 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 '用戶id',
`admin_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶名',
`route` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模塊名稱',
`method` enum('delete','put','post','get') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'get' COMMENT '請求方式 1get 2post 3put 4delete',
`req_data` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '請求數(shù)據(jù)',
`ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用戶ip',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時間',
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.新建定時任務
新建定時任務,定時訪問步驟1的sync_behavior_log地址就行了, 建議5分鐘1次
至此, 有用戶訪問時,數(shù)據(jù)表就會每隔一段時間就批量插入行為日志數(shù)據(jù)了
總結
寫得比較簡單粗暴, 有些地方需要自己實現(xiàn), 比如獲取登錄用戶信息…
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 關于Thinkphp6的日志問題
- Thinkphp6.0中間件的具體使用
- ThinkPHP6.0前置、后置中間件區(qū)別
- thinkphp6使用mysql悲觀鎖解決商品超賣問題的實現(xiàn)
- phpstorm遠程連接服務器并實時更新發(fā)布代碼(thinkphp6.0.7)
- ThinkPHP6.0 重寫URL去掉Index.php的解決方法
- ThinkPHP6通過Ucenter實現(xiàn)注冊登錄的示例代碼
- ThinkPHP6.0如何利用自定義驗證規(guī)則規(guī)范的實現(xiàn)登陸
- 讓whoops幫我們告別ThinkPHP6的異常頁面
- 基于thinkphp6.0的success、error實現(xiàn)方法
- 使用composer安裝使用thinkphp6.0框架問題【視頻教程】
- 寶塔中ThinkPHP框架使用Redis的一系列教程
- thinkphp6中Redis 的基本使用方法詳解
相關文章
PHP中set error handler函數(shù)用法小結
set_error_handler() 函數(shù)設置用戶自定義的錯誤處理函數(shù)。該函數(shù)用于創(chuàng)建運行時期間的用戶自己的錯誤處理方法。該函數(shù)會返回舊的錯誤處理程序,若失敗,則返回 null2015-11-11
laravel通過創(chuàng)建自定義artisan make命令來新建類文件詳解
Laravel通過Artisan提供了強大的控制臺命令來處理非瀏覽器業(yè)務邏輯。下面這篇文章主要給大家介紹了關于laravel如何通過創(chuàng)建自定義artisan make命令來新建類文件的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08
基于在生產環(huán)境中使用php性能測試工具xhprof的詳解
本篇文章是對在生產環(huán)境中使用php性能測試工具xhprof進行了詳細的分析介紹,需要的朋友參考下2013-06-06
Zend Framework教程之配置文件application.ini解析
這篇文章主要介紹了Zend Framework教程之配置文件application.ini用法,分析了配置文件application.ini中常見的配置項含義及用法,需要的朋友可以參考下2016-03-03
PHP模板引擎Smarty內建函數(shù)section,sectionelse用法詳解
這篇文章主要介紹了PHP模板引擎Smarty內建函數(shù)section,sectionelse用法,結合實例形式詳細分析了section,sectionelse進行循環(huán)處理的技巧與使用方法,需要的朋友可以參考下2016-04-04

