検索
ホームページPHPフレームワークThinkPHP分析例: thinkphp がミドルウェアを使用して動作ログを記録する方法

この記事では、PHP に関する関連知識を提供します。主に、ログ チャネルを使用して動作ログを一時的に保存する、スケジュールされたタスクを使用して定期的に書き込みを行うなど、例に基づいてミドルウェアを使用して動作ログを記録する問題について説明します。内容をデータベースに記録するなど、皆さんの参考になれば幸いです。

分析例: thinkphp がミドルウェアを使用して動作ログを記録する方法

##推奨学習: 「

PHP ビデオ チュートリアル

1. ミドルウェアを定義します

はい すぐに生成しますコマンドライン命令によるミドルウェア

php think make:middleware Behavior

分析例: thinkphp がミドルウェアを使用して動作ログを記録する方法 この命令は、app/middleware ディレクトリの下に Behavior ミドルウェアを生成します。内容は次のとおりです。

<?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を開き、「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 がミドルウェアを使用して動作ログを記録する方法 ファイルを開くと、データが書き込まれています。

{"time":"2022-04-16T21:38:48 08: 00","type":"info","msg":"{"admin_id ":888,"admin_user":"fanchen","route":"index\/index\/test","method":" get","re​​q_tp":"normal","re​​q_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 分に 1 回行うことをお勧めします。

この時点で、ユーザーがアクセスすると、データ テーブルは時々バッチで動作ログ データを挿入します。

推奨学習: 「

PHP ビデオ チュートリアル

以上が分析例: thinkphp がミドルウェアを使用して動作ログを記録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はCSDNで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。