>  기사  >  PHP 프레임워크  >  분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법

분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법

WBOY
WBOY앞으로
2022-05-18 11:50:313785검색

이 글에서는 PHP에 대한 관련 지식을 제공합니다. 로그 채널을 사용하여 동작 로그를 임시로 저장하고 예약된 작업을 사용하여 로그 콘텐츠에 기록하는 등 예제를 기반으로 미들웨어를 사용하여 동작 로그를 기록하는 문제를 주로 살펴봅니다. 데이터베이스 등을 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법

추천 학습: "PHP 비디오 튜토리얼"

1. 미들웨어 정의

명령줄 지침을 통해 빠르게 미들웨어를 생성할 수 있습니다.

php think make:middleware Behavior

분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법
이 명령은 app/middleware 디렉토리에 동작을 생성합니다. 미들웨어. 내용은 다음과 같습니다.

<?phpdeclare  (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();   				//当前登录用户的信息,自己实现
         $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);
    }}

2. 로그 채널을 사용하여 행동 로그를 임시 저장합니다

행동 로그를 데이터베이스에 실시간으로 기록하는 것은 권장되지 않습니다. 이는 데이터베이스에 불필요한 부담을 줄 수 있습니다. 로그 파일 캐시를 정기적으로 데이터베이스에 저장합니다.
提示:先阅读官方日志处理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
로그 처리

1. 로그 구성 파일을 수정합니다

config/log.php를 '채널' => []에서 열고 마지막으로 녹음을 위한 별도의 채널을 추가합니다. 행동 로그:

 // 其它日志通道配置
 //行为日志
 '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가 미들웨어를 사용하여 행동 로그를 기록하는 방법
파일을 열면 데이터가 기록되었습니다

{"time":"2022-04-16T21:38:48+08:00" ,"type":"info","msg":"{"admin_id":888,"admin_user":"fanchen"," 경로":"색인/색인/테스트","방법":"get"," req_tp":"normal","req_data":"{"a":"1","b":"2"}" ,"ip":"127.0.0.1","create_time":1650116328}"}


3. 예약된 작업을 사용하여 정기적으로 데이터베이스에 로그 콘텐츠를 씁니다

1. 예약된 작업이 필요한 새 API 메서드를 만듭니다.

 /**
     * 定时任务服务器定时将用户行为日志插入到数据库
     * @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);     //批量插入数据库
                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분마다

이 시점에서 사용자가 데이터 테이블에 접근하면 행동 로그 데이터가 일정한 간격으로 일괄 삽입됩니다.

추천 학습: " PHP 비디오 튜토리얼

위 내용은 분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제