Jtti广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >thinkphp6如何使用中间件记录行为日志
  • 765
分享到

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

thinkphp6中间件中间件记录行为日志thinkphp6行为日志 2023-03-24 08:03:50 765人浏览 独家记忆
摘要

目录前言一、定义中间件二、使用日志通道暂存行为日志1.修改log配置文件2.注册全局中间件3.测试能否成功生成日志三、使用定时任务将日志内容定时写入数据库1.新建一个api方法2.新

前言

发现本站没有一个靠谱的tp6记录行为日志的教程,于是就整理了一下自己在项目中已经投入使用的行为日志中间件的详细配置步骤供大家参考

提示:先阅读官方中间件教程 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
{
    
    public function handle($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()
         ];
         //end
         return $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方法

要求定时任务可以访问到

 
    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);     //批量插入数据库
                file_put_contents($path, '');       //清空文件日志
                echo '采集用户行为日志成功' . count($d);
            } catch (DbException $e) {
                echo ($e->getMessage());
            }
        }
    }

2.新建行为日志数据表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 '请求数据',
  `ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户ip',
  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
  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次

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

总结

写得比较简单粗暴, 有些地方需要自己实现, 比如获取登录用户信息…

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: thinkphp6如何使用中间件记录行为日志

本文链接: https://www.lsjlt.com/news/201105.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • thinkphp6如何使用中间件记录行为日志
    目录前言一、定义中间件二、使用日志通道暂存行为日志1.修改log配置文件2.注册全局中间件3.测试能否成功生成日志三、使用定时任务将日志内容定时写入数据库1.新建一个api方法2.新...
    765
    2023-05-30
    thinkphp6中间件 中间件记录行为日志 thinkphp6行为日志
  • 如何使用Casbin作为ThinkPHP的权限控制中间件
    目录概述安装中间件Casbin Model 配置验证概述 PHP-Casbin是一个强大的、高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理。 Think-Casbin是...
    304
    2023-05-30
    thinkphp casbin casbin 中间件
  • 关于Thinkphp6的日志问题
    目录Thinkphp6的日志问题设置日志记录级别单一日志独立日志日志的写入时机日志通道Thinkphp6异常处理与日志异常处理日志手动记录日志关闭日志总结Thinkphp6的日志问题...
    774
    2023-05-30
    Thinkphp6的日志 Thinkphp6日志 关于Thinkphp6日志
  • 怎样使用Nodejs创建访问日志记录的中间件
    怎样使用Nodejs创建访问日志记录的中间件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。中间件-访问日志目标利用中间件技术,写一个用来记录访...
    862
    2023-05-30
    nodejs
  • mysql中mycat 中间件如何使用
    本篇文章给大家分享的是有关mysql中mycat 中间件如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一,什么是mycat一个彻底开源...
    768
    2023-05-30
    mysql mycat
  • MySQL中如何使用DAL中间件
    本篇文章给大家分享的是有关MySQL中如何使用DAL中间件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Atlas是由 Qihoo  ...
    860
    2023-05-30
    mysql dal
  • nodejs中Express中间件如何使用
    本篇文章给大家分享的是有关nodejs中Express中间件如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Express是一个基于No...
    236
    2023-05-30
    express nodejs
  • FastAPI--中间件(6)
    所谓的中间件,其实和我们bottle中的中间件作用是一致。有些方法或操作需要在所有路由之前执行,比如要加一个http访问的拦截器,可以对部分接口API需要授权才能访问的接口进行验证之类的。FastAPI提供了一个@app.middlewar...
    679
    2023-05-30
    中间件 FastAPI
  • 如何使用分库分表中间件
    这篇文章主要介绍“如何使用分库分表中间件”,在日常操作中,相信很多人在如何使用分库分表中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分库分表中间件”的疑惑有所帮...
    591
    2023-05-30
    数据库
  • 如何使用和配置Mysql KingShard中间件
    如何使用和配置Mysql KingShard中间件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 ...
    573
    2023-05-30
    kingshard mysql
  • 如何使用ActiveMQ中间件方式发送邮件
    前言 在大型互联网公司中,一般都会搭建内部的消息服务平台,处理公司内部的各种消息服务,比如:发送邮件、发送短信、微信推送等,公司内部消息平台再去调用第三发消息平台。消息服务平台的接...
    716
    2023-05-30
    ActiveMQ中间件 中间件方式 发送邮件
  • Django 中间件
    目录 一.中间件 二.中间件用途 三.中间件方法 四.自定义中间件 process_view proc...
    210
    2023-05-30
    中间件 Django
  • Django中间件的使用
    中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和resp...
    330
    2023-05-30
    中间件 Django
  • 如何掌握Mycat中间件
    本篇内容主要讲解“如何掌握Mycat中间件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何掌握Mycat中间件”吧!分布式数据存储与MycatMycat架构介...
    220
    2023-05-30
    mycat
  • .NET 6中间件Http Logging使用介绍
    Intro .NET 6 会引入一个 Http logging 的中间件,可以用来帮助我们比较方便记录请求和响应的信息 Sample 废话不多说,直接来看示例吧 var build...
    466
    2023-05-30
    .NET 6 Http Logging Http Logging
  • nodejs中间件使用实例分析
    这篇文章主要介绍了nodejs中间件使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs中间件使用实例分析文章都会有所收获,下面我们一起来看看吧。 ...
    241
    2023-05-30
    nodejs
  • Laravel中间件的使用详解
    目录一:创建中间件二:前置和后置中间件1:前置中间件2:后置中间件三:注册中间件1:注册全局中间件2:为路由分配中间件3:中间件组4:排序中间件5:中间件参数6:Terminable...
    767
    2023-05-30
    Laravel中间件使用 Laravel中间件
  • NodeJsExpress中间件使用流程解析
    目录1、调用流程2、格式3、next函数的作用4、定义中间件函数5、全局生效的中间件6、中间件的作用7、定义多个全局中间件8、局部生效的中间件9、定义多个局部中间件10、了解中间件的...
    151
    2023-05-30
    NodeJs Express中间件 NodeJs Express NodeJs 中间件
  • Django之中间件
    中间件介绍   中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。   但是由于其影响的是全局,所以需要谨慎使...
    196
    2023-05-30
    中间件 Django
  • django中间件-12
    目录 自定义中间件 函数定义 类定义 中间件的执行顺序 在django中,中间件其实...
    927
    2023-05-30
    中间件 django
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作