Laravel对接SLS日志服务

Laravel对接SLS日志服务(写入和读取)

1、下载阿里云的sdk

#通过composer下载
composer require  alibabacloud/aliyun-log-php-sdk

#对应的git仓库 
https://github.com/aliyun/aliyun-log-php-sdk

2、创建sdk请求的service

<?php

namespace App\Services;

use Aliyun_Log_Client;
use Aliyun_Log_Models_LogItem;
use Aliyun_Log_Models_PutLogsRequest;
use Aliyun_Log_Models_GetLogsRequest;
use Aliyun_Log_Models_GetHistogramsRequest;
use Exception;
use Illuminate\Support\Facades\Log;

class SLSTimeSeriesService
{
    protected $client;
    protected $project;
    protected $logstore;

    public function __construct()
    {
        // 从配置中获取凭证
        $endpoint = env('ALIYUN_SLS_ENDPOINT');
        $accessKeyId = env('ALIYUN_ACCESS_KEY_ID');
        $accessKeySecret = env('ALIYUN_ACCESS_KEY_SECRET');

        // 验证配置
        if (!$endpoint || !$accessKeyId || !$accessKeySecret) {
            throw new Exception('SLS configuration is missing');
        }

        // 初始化客户端
        $this->client = new Aliyun_Log_Client($endpoint, $accessKeyId, $accessKeySecret);
        $this->project = env('ALIYUN_SLS_PROJECT');
        $this->logstore = env('ALIYUN_SLS_LOGSTORE');
    }


    /**
     * 查询日志(带分页和排序)
     */
    public function getLogs($query = '', $from = null, $to = null, $page = 1, $perPage = 10, $sort = 'desc', $sortField = '__time__')
    {
        try {
            $from = $from ?: time() - 3600;
            $to = $to ?: time();

            // 计算偏移量
            $offset = ($page - 1) * $perPage;

            // 获取总数
            $histogramRequest = new Aliyun_Log_Models_GetHistogramsRequest(
                $this->project,
                $this->logstore,
                $from,
                $to,
                '',
                $query ?: '*'
            );

            $histogramResponse = $this->client->getHistograms($histogramRequest);
            $total = $histogramResponse->getTotalCount();

            // 创建日志查询请求
            $request = new Aliyun_Log_Models_GetLogsRequest(
                $this->project,
                $this->logstore,
                $from,
                $to,
                '',
                $query ?: '*',
                1000,  // 先获取较多数据以便排序
                0,
                true
            );

            // 执行查询
            $response = $this->client->getLogs($request);
            $logs = $response->getLogs();

            // 处理日志数据
            $formattedLogs = [];
            foreach ($logs as $log) {
                $contents = $log->getContents();
                $contents['log_time'] = date('Y-m-d H:i:s', $log->getTime());
                $formattedLogs[] = $contents;
            }

            // 自定义排序
            if ($sortField !== '__time__') {
                usort($formattedLogs, function($a, $b) use ($sortField, $sort) {
                    // 确保字段存在
                    $valueA = isset($a[$sortField]) ? $a[$sortField] : '';
                    $valueB = isset($b[$sortField]) ? $b[$sortField] : '';

                    // 如果是数字字符串,转换为数字比较
                    if (is_numeric($valueA) && is_numeric($valueB)) {
                        $valueA = (float)$valueA;
                        $valueB = (float)$valueB;
                    }

                    // 根据排序方向比较
                    if ($sort === 'asc') {
                        return $valueA <=> $valueB;
                    }
                    return $valueB <=> $valueA;
                });
            }

            // 应用分页
            $formattedLogs = array_slice($formattedLogs, $offset, $perPage);

            // 返回结果
            return [
                'logs' => $formattedLogs,
                'pagination' => [
                    'total' => $total,
                    'per_page' => $perPage,
                    'current_page' => $page,
                    'last_page' => ceil($total / $perPage),
                    'from' => $offset + 1,
                    'to' => $offset + count($formattedLogs)
                ]
            ];

        } catch (Exception $e) {
            Log::error('SLS Get Error: ' . $e->getMessage());
            throw $e;
        }
    }

    /**
     * 写入日志
     */
    public function putLogs($data)
    {
        try {
            // 确保所有值都是字符串
            $contents = [];
            foreach ($data as $key => $value) {
                $contents[$key] = is_array($value) ? json_encode($value) : (string)$value;
            }

            // 创建日志内容
            $logItem = new Aliyun_Log_Models_LogItem();
            $logItem->setTime(time());
            $logItem->setContents($contents);

            // 创建请求
            $request = new Aliyun_Log_Models_PutLogsRequest(
                $this->project,
                $this->logstore,
                'test_topic',
                '',
                [$logItem]
            );

            // 发送日志
            $response = $this->client->putLogs($request);

            return true;
        } catch (Exception $e) {
            Log::error('SLS Put Error: ' . $e->getMessage());
            throw $e;
        }
    }



    /**
     * 查询所有日志(不分页)
     * @param string $query 查询条件
     * @param int|null $from 开始时间
     * @param int|null $to 结束时间
     * @return array
     * 循环,速度慢,不推荐使用
     */
    public function getAllLogs($query = '', $from = null, $to = null, $sort = 'desc', $sortField = '__time__')
    {
        try {
            $from = $from ?: time() - 3600;
            $to = $to ?: time();

            // 构建查询语句
            $searchQuery = !empty($query) ? $query : '*';
            $allLogs = [];
            $offset = 0;
            $limit = 100;  // 每次获取100条

            do {
                // 创建日志查询请求
                $request = new Aliyun_Log_Models_GetLogsRequest(
                    $this->project,
                    $this->logstore,
                    $from,
                    $to,
                    '',             // topic
                    $searchQuery,   // 查询语句
                    $limit,         // 每次获取数量
                    $offset,        // 当前偏移量
                    $sort === 'desc' // 是否倒序
                );

                // 执行查询
                $response = $this->client->getLogs($request);
                $logs = $response->getLogs();
                $count = count($logs);



                // 处理本批次的日志数据
                foreach ($logs as $log) {
                    $contents = $log->getContents();

                    // 解析 value 字段
                    if (isset($contents['__value__']) && is_string($contents['__value__'])) {
                        try {
                            $decodedValue = json_decode($contents['__value__'], true);
                            if (json_last_error() === JSON_ERROR_NONE) {
                                $contents['__value__'] = $decodedValue;
                            }
                        } catch (\Exception $e) {
                            // 保持原值
                        }
                    }

                    $contents['log_time'] = date('Y-m-d H:i:s', $log->getTime());
                    $allLogs[] = $contents;
                }

                // 更新偏移量
                $offset += $count;

                // 如果返回的数据少于限制数,说明已经没有更多数据
                if ($count < $limit) {
                    break;
                }

            } while (true);

            // 如果需要按其他字段排序
            if ($sortField !== '__time__') {
                usort($allLogs, function($a, $b) use ($sortField, $sort) {
                    $valueA = isset($a[$sortField]) ? $a[$sortField] : '';
                    $valueB = isset($b[$sortField]) ? $b[$sortField] : '';

                    if (is_numeric($valueA) && is_numeric($valueB)) {
                        $valueA = (float)$valueA;
                        $valueB = (float)$valueB;
                    }

                    return $sort === 'asc' ?
                        ($valueA <=> $valueB) :
                        ($valueB <=> $valueA);
                });
            }



            return [
                'logs' => $allLogs,
                'total' => count($allLogs),
                'query_info' => [
                    'query' => $searchQuery,
                    'from' => date('Y-m-d H:i:s', $from),
                    'to' => date('Y-m-d H:i:s', $to),
                    'sort_field' => $sortField,
                    'sort_order' => $sort,
                    'total_batches' => ceil($offset / $limit)
                ]
            ];

        } catch (Exception $e) {
//            Log::error('SLS Get All Logs Error', [
//                'error' => $e->getMessage(),
//                'query' => $searchQuery ?? '',
//                'from' => date('Y-m-d H:i:s', $from),
//                'to' => date('Y-m-d H:i:s', $to),
//                'offset' => $offset ?? 0
//            ]);
            throw $e;
        }
    }


    /**
     * 查询所有日志(不分页)
     * @param $query
     * @param $from
     * @param $to
     * @param $userId
     * @param $sortOrder
     * @return array
     * sql limit的方式,有排序限制,速度快
     */
    public function getAllLogsSql($query = '', $from = null, $to = null, $userId = null, $sortOrder = 'ASC')
    {
        try {
            $from = $from ?: time() - 3600; // 默认查询最近1小时
            $to = $to ?: time();

            // 获取总数,会消耗一定的时间,数量越大,消耗的时间越多,如果想节约时间,可以设置一个最大值类型10W之类的
//            $histogramRequest = new Aliyun_Log_Models_GetHistogramsRequest(
//                $this->project,
//                $this->logstore,
//                $from,
//                $to,
//                '',
//                $query ?: '*'
//            );
//
//            $histogramResponse = $this->client->getHistograms($histogramRequest);
//            $total = $histogramResponse->getTotalCount();
//            $maxResults = $total; // 一次性拉取的最大数量
            $maxResults = 100000; // 一次性拉取的最大数量


            // 构建基础查询语句
            $searchQuery = !empty($query) ? $query : '*';

            // 如果有 user_id 条件,添加筛选
            if ($userId) {
//                $searchQuery .= sprintf(" AND user_id='%s'", $userId);
                $searchQuery .= sprintf(" AND user_id=%d", (int)$userId);

            }



//            Log::info('Starting Query', [
//                'query' => $searchQuery,
//                'from' => date('Y-m-d H:i:s', $from),
//                'to' => date('Y-m-d H:i:s', $to),
//                'sortOrder' => $sortOrder,
//            ]);

            // SQL 查询语句,按时间排序
            $sqlQuery = sprintf(
                "%s | SELECT * ORDER BY __time__ %s LIMIT %d",
                $searchQuery,
                strtoupper($sortOrder), // ASC 或 DESC
                $maxResults
            );

//            Log::info('Executing SQL Query', [
//                'query' => $sqlQuery,
//                'from' => date('Y-m-d H:i:s', $from),
//                'to' => date('Y-m-d H:i:s', $to),
//            ]);

            // 发送请求
            $request = new Aliyun_Log_Models_GetLogsRequest(
                $this->project,
                $this->logstore,
                $from,
                $to,
                '',             // topic
                $sqlQuery,      // 查询语句
                0,              // batchSize 无用
                0,              // offset 无用
                false           // 不自动排序(已通过 SQL 排序)
            );

            $response = $this->client->getLogs($request);
            $logs = $response->getLogs();
            $allLogs = [];

            // 处理返回的日志数据
            foreach ($logs as $log) {
                $contents = $log->getContents();

                // 解析 value 字段
                if (isset($contents['__value__']) && is_string($contents['__value__'])) {
                    try {
                        $decodedValue = json_decode($contents['__value__'], true);
                        if (json_last_error() === JSON_ERROR_NONE) {
                            $contents['__value__'] = $decodedValue;
                        }
                    } catch (\Exception $e) {
                        // 保持原值
                    }
                }

                $contents['log_time'] = date('Y-m-d H:i:s', $log->getTime());
                $allLogs[] = $contents;
            }

//            Log::info('Query Completed', [
//                'fetched' => count($allLogs),
//                'total_expected' => $maxResults,
//            ]);

            return [
                'logs' => $allLogs,
                'total' => count($allLogs),
                'query_info' => [
                    'query' => $searchQuery,
                    'from' => date('Y-m-d H:i:s', $from),
                    'to' => date('Y-m-d H:i:s', $to),
                    'total_fetched' => count($allLogs),
                    'sort_order' => $sortOrder,
                ]
            ];

        } catch (Exception $e) {
//            Log::error('SLS Query Error', [
//                'error' => $e->getMessage(),
//                'query' => $searchQuery ?? '',
//                'from' => date('Y-m-d H:i:s', $from),
//                'to' => date('Y-m-d H:i:s', $to),
//                'sort_order' => $sortOrder,
//            ]);
            throw $e;
        }
    }
}

3、创建config配置

# config/sls.config
<?php
return [
    'aliyun' => [
        'access_key_id' => env('ALIYUN_ACCESS_KEY_ID'),
        'access_key_secret' => env('ALIYUN_ACCESS_KEY_SECRET'),
        'sls' => [
            'endpoint' => env('ALIYUN_SLS_ENDPOINT'),
            'project' => env('ALIYUN_SLS_PROJECT'),
            'logstore' => env('ALIYUN_SLS_LOGSTORE'),
        ],
    ],
];

4、从阿里云获取对应的配置填写在env

# .env,同阿里云账号下的服务器是允许内网访问的
ALIYUN_SLS_ENDPOINT=cn-shenzhen.log.aliyuncs.com
#内网
#ALIYUN_SLS_ENDPOINT=cn-shenzhen-intranet.log.aliyuncs.com
ALIYUN_SLS_PROJECT=
ALIYUN_ACCESS_KEY_ID=
ALIYUN_ACCESS_KEY_SECRET=
ALIYUN_SLS_LOGSTORE=

5、创建控制器进行验证

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Jobs\Sugar;
use App\Services\SLSTimeSeriesService;
use Exception;
use Illuminate\Http\Request;

class MetricsController extends Controller
{
    protected $slsService;

    // 定义允许排序的字段
    // 定义允许排序的字段和默认排序方式
    protected $allowedSortFields = [
        '__time__',      // 日志时间
        '__tag__:__receive_time__', // 接收时间
        'timestamp',     // 自定义时间戳
        'user_id',     // 自定义时间戳
    ];

    public function __construct(SLSTimeSeriesService $slsService)
    {
        $this->slsService = $slsService;
    }


    /**
     * 写入日志
     */
    public function store(Request $request)
    {

        try {
            $data = [
                'event' => 'user_login',
                'user_id' => (string)$request->input('user_id', '1'),
                'ip' => $request->ip(),
                'timestamp' => (string)time(),
                'request_data' => $request->all()
            ];

            $this->slsService->putLogs($data);


            return response()->json([
                'success' => true,
                'message' => 'Log stored successfully'
            ]);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage()
            ], 500);
        }
    }

    //分页查询
    public function index(Request $request)
    {
        try {
            // 构建查询条件
            $conditions = [];

            if ($request->has('user_id')) {
                $conditions[] = 'user_id = "' . $request->user_id . '"';
            }
            if ($request->has('event')) {
                $conditions[] = 'event = "' . $request->event . '"';
            }

            // 获取排序参数
            $sortField = $request->input('sort_by', '__time__'); // 默认使用日志时间排序
            $sortOrder = $request->input('sort', 'desc');

            // 验证排序字段
            if (!in_array($sortField, $this->allowedSortFields)) {
                $sortField = '__time__';
            }

            // 验证排序方向
            $sortOrder = strtolower($sortOrder) === 'asc' ? 'asc' : 'desc';

            // 构建基本查询
            $query = !empty($conditions) ? implode(' and ', $conditions) : '*';

            // 获取分页参数
            $page = (int)$request->input('page', 1);
            $perPage = (int)$request->input('per_page', 10);

            // 时间范围
            $from = $request->input('from') ? strtotime($request->input('from')) : time() - 3600;
            $to = $request->input('to') ? strtotime($request->input('to')) : time();

            // 记录查询参数


            // 获取数据
            $result = $this->slsService->getLogs(
                $query,
                $from,
                $to,
                $page,
                $perPage,
                $sortOrder,
                $sortField
            );


            return response()->json([
                'success' => true,
                'data' => $result['logs'],
                'pagination' => $result['pagination'],
                'query_info' => [
                    'query' => $query,
                    'conditions' => $conditions,
                    'sort' => [
                        'field' => $sortField,
                        'order' => $sortOrder
                    ],
                    'from' => date('Y-m-d H:i:s', $from),
                    'to' => date('Y-m-d H:i:s', $to)
                ]
            ]);
        } catch (Exception $e) {


            return response()->json([
                'success' => false,
                'message' => $e->getMessage(),
                'query_info' => [
                    'query' => $query ?? '*',
                    'conditions' => $conditions ?? []
                ]
            ], 500);
        }
    }


    /**
     * @param Request $request
     * @return array
     * @throws Exception
     * 循环查询,速度慢,排序无限制,不分页
     */
    public function all(Request $request)
    {
        // 时间范围
        $from = $request->input('from') ? strtotime($request->input('from')) : time() - 3600;
        $to = $request->input('to') ? strtotime($request->input('to')) : time();

        // 自定义排序
        $result = $this->slsService->getAllLogs(
            '*',
            $from,
            $to,
            'desc',
            'timestamp'
        );
        return $result;
    }


    /**
     * @param Request $request
     * @return array
     * @throws Exception
     * sql查询,速度快,排序有限制,需要有索引才能查询出来,不分页
     */
    public function allSql(Request $request)
    {
        $user_id = $request->input('user_id') ?? '';
        // 时间范围
        $from = $request->input('from') ? strtotime($request->input('from')) : time() - 3600;
        $to = $request->input('to') ? strtotime($request->input('to')) : time();


        $result = $this->slsService->getAllLogsSql(
            '*',
            $from,
            $to,
            $user_id,
            'desc'
        );
        return $result;
    }
}

6、效果如下
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp接入高德地图

下面代码兼容安卓APP和H5 高德地图官网&#xff1a;我的应用 | 高德控制台 &#xff0c;绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…

初识WGCLOUD - 监测磁盘空间还能使用多久

WGCLOUD是一款免费开源的运维监控软件&#xff0c;性能优秀&#xff0c;部署简单&#xff0c;轻巧使用&#xff0c;支持大部分的Linux和Windows、安卓、MacOS等平台安装部署 最近发布的新版本 v3.5.4&#xff0c;WGCLOUD新增了可以自动计算每个磁盘剩余空间的可使用天数&#x…

【Xbim+C#】创建圆盘扫掠IfcSweptDiskSolid

基础回顾 https://blog.csdn.net/liqian_ken/article/details/143867404 https://blog.csdn.net/liqian_ken/article/details/114851319 效果图 代码示例 在前文基础上&#xff0c;增加一个工具方法&#xff1a; public static IfcProductDefinitionShape CreateDiskSolidSha…

数据结构 ——— 堆排序算法的实现

目录 前言 向下调整算法&#xff08;默认建大堆&#xff09; 堆排序算法的实现&#xff08;默认升序&#xff09; 前言 在之前几章学习了如何用向上调整算法和向下调整算法对数组进行建大/小堆数据结构 ——— 向上/向下调整算法将数组调整为升/降序_对数组进行降序排序代码…

图像预处理之图像滤波

目录 图像滤波概览 均值滤波&#xff08;Mean Filter&#xff09; 中值滤波&#xff08;Median Filter&#xff09; 高斯滤波&#xff08;Gaussian Filter&#xff09; 双边滤波&#xff08;Bilateral Filter&#xff09; 方框滤波&#xff08;Box Filter&#xff09; S…

Qt-多元素控件

Qt中的多元素控件 Qt提供的多元素控件有&#xff1a; 这里的多元素控件都是两两一对的。 xxWidget和xxView的一个比较简单的理解就是&#xff1a; xxView是更底层的实现&#xff0c; xxWidget是基于xxView封装来的。 可以说&#xff0c;xxView使用起来比较麻烦&#xff0c;但…

<Sqlite><websocket>使用Sqlite与websocket,实现网页端对数据库的【读写增删】操作

前言 本文是在websocket进行通讯的基础,添加数据库进行数据的存储,数据库软件使用的是sqlite。 环境配置 系统:windows 平台:visual studio code 语言:javascript、html 库:nodejs、sqlite 概述 此前,我们实现在利用websocket和socket,将网页端与下位控制器如PLC进行…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

主IP地址与从IP地址:深入解析与应用探讨

在互联网的浩瀚世界中&#xff0c;每台联网设备都需要一个独特的身份标识——IP地址。随着网络技术的不断发展&#xff0c;IP地址的角色日益重要&#xff0c;而“主IP地址”与“从IP地址”的概念也逐渐进入人们的视野。这两个术语虽然看似简单&#xff0c;实则蕴含着丰富的网络…

【Linux】文件IO的系统接口 | 文件标识符

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 最近真的任务拉满了&…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

OpenAI 助力数据分析中的模式识别与趋势预测

数据分析师的日常工作中&#xff0c;发现数据中的隐藏模式和预测未来趋势是非常重要的一环。借助 OpenAI 的强大语言模型&#xff08;如 GPT-4&#xff09;&#xff0c;我们可以轻松完成这些任务&#xff0c;无需深厚的编程基础&#xff0c;也能快速上手。 在本文中&#xff0…

基于深度学习的点云分割网络及点云分割数据集

点云分割是根据空间、几何和纹理等特征对点云进行划分&#xff0c;使得同一划分内的点云拥有相似的特征。点云的有效分割是许多应用的前提&#xff0c;例如在三维重建领域&#xff0c;需要对场景内的物体首先进行分类处理&#xff0c;然后才能进行后期的识别和重建。 传统的点…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化&#xff0c;植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础&#xff0c;也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

MySQL 没有数据闪回?看 zCloud 如何补齐MySQL数据恢复能力

ENMOTECH 上一篇文章为大家介绍了某金融科技企业通过 zCloud 多元数据库智能管理平台的告警中心“警警”有条地管理告警并进行敏捷处置的实践案例。本篇跟大家继续分享该案例客户如何利用 zCloud 备份恢复模块下的Binlog解析功能补齐 MySQL 数据恢复能力&#xff0c;让运维人员…

transformer.js(四): 模型接口介绍

前面的文章底层架构及性能优化指南介绍了transformer.js的架构和优化策略&#xff0c;在本文中&#xff0c;将详细介绍 transformer.js 的模型接口&#xff0c;帮助你了解如何在 JavaScript 环境中使用这些强大的工具。 推荐阅读 ansformer.js&#xff08;二&#xff09;&…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点&#xff1a; STP的选举&#xff08;Listening状态中&#xff09;&#xff1a; RSTP P/A&#xff08;提议/同意&#xff09;机制 同步机制&#xff1a; 边缘端口的配置&#xff1a; RSTP的端口角色划分&#xff1a; ensp模拟…

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…

java基础概念38:正则表达式3-捕获分组

一、定义 分组就是一个小括号。 分组的特点&#xff1a; 二、捕获分组 捕获分组就是把这一组的数据捕获出来&#xff0c;再用一次。 后续还要继续使用本组的数据。 正则内部使用&#xff1a;\\组号正则外部使用&#xff1a;$组号 2-1、正则内部使用&#xff1a;\\组号 示…