Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志

本指南演示了如何从 Node.js Web 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后在向 Node.js 服务器发出请求时,你将在 Kibana 中查看日志事件的实时可视化。虽然此示例使用的是 Node.js,但这种监控日志输出的方法适用于多种客户端类型。查看可用的 ECS 日志记录插件列表。

前提条件

要完成这些步骤,你需要在系统上安装以下应用程序:

  • Node.js - 你将设置一个简单的 Node.js Web 服务器和客户端应用程序。查看 Node.js 下载页面以获取安装说明。

提示:对于以下三个软件包,你可以创建一个工作目录,使用 Node 软件包管理器 (NPM) 安装这些软件包。然后,你可以从同一目录运行 Node.js Web 服务器和客户端,以便它们可以使用这些软件包。或者,你也可以通过运行带有 -g 选项的 Node 软件包安装命令来全局安装 Node 软件包。有关详细信息,请参阅 NPM 软件包安装说明。

由于 Node.js 的版本可能造成一定的区别。在我的电脑上,使用如下的版本:

$ node -v
v22.4.1
  • winston - 这是 Node.js 的一个流行日志包。创建一个新的本地目录并运行以下命令在其中安装 winston:
npm install winston
  • Node.js winston logger 的 Elastic Common Schema (ECS) 格式化程序 - 此插件将你的 Node.js 日志格​​式化为 ECS 结构化 JSON 格式,非常适合提取到 Elasticsearch 中。要安装 ECS winston logger,请在你的工作目录中运行以下命令,以便将软件包安装在与 winston 软件包相同的位置:
npm install @elastic/ecs-winston-format
  • Got - Got 是一个“人性化且功能强大的 Node.js HTTP 请求库”。 - 此插件可用于查询本教程中使用的示例 Web 服务器。要安装 Got 包,请在工作目录中运行以下命令:
npm install got

你可以使用如下的命令安装最新的 got 版本:

npm install got@latest
$ npm -v got
10.8.1

安装

 Elasticsearch 及 Kibana 安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。特别值得指出的是:ES|QL 只在 Elastic Stack 8.11 及以后得版本中才有。你需要下载 Elastic Stack 8.11 及以后得版本来进行安装。

在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:

在上面,我们可以看到 elastic 超级用户的密码。我们记下它,并将在下面的代码中进行使用。

我们还可以在安装 Elasticsearch 目录中找到 Elasticsearch 的访问证书:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.14.1/config/certs
$ ls
http.p12      http_ca.crt   transport.p12

在上面,http_ca.crt 是我们需要用来访问 Elasticsearch 的证书。

 生成 API key

在今天的配置中,我们将使用 API key 来配置 Filebeat。我们来在 Kibana 中申请一个 key:

我们点击上面的 copy 按钮来拷贝 API key:OTsKgpABdr8VH6CAEv9z:caX69H6uQ7qcWKxQxeopuQ

我们也可以使用如下的命令来活动 API key:

POST /_security/api_key
{
 "name": "filebeat-api-key",
 "role_descriptors": {
   "logstash_read_write": {
     "cluster": ["manage_index_templates", "monitor"],
     "index": [
       {
         "names": ["filebeat-*"],
         "privileges": ["create_index", "write", "read", "manage"]
       }
     ]
   }
 }
}

上面的命令将会得到如下所示的回复:

{
  "id": "OzunhZABdr8VH6CAcP_-",
  "name": "filebeat-api-key",
  "api_key": "8-DGUNfjRyu4jw4EnKs16Q",
  "encoded": "T3p1bmhaQUJkcjhWSDZDQWNQXy06OC1ER1VOZmpSeXU0anc0RW5LczE2UQ=="
}

 本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使用的是 Python,但这种监控日志输出的方法适用于多种客户端类型。查看可用的 ECS 日志记录插件列表。

在今天的展示中,我将使用 Elastic Stack 8.14.1 来进行展示。

前提

要完成这些步骤,你需要在系统上安装 Python 以及 Python 日志库的 Elastic Common Schema (ECS) 记录器。

要安装 ecs-logging-python,请运行:

python -m pip install ecs-logging

准备

Elasticsearch 及 Kibana 安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,我们选择 Elastic Stack 8.x 来进行安装。特别值得指出的是:ES|QL 只在 Elastic Stack 8.11 及以后得版本中才有。你需要下载 Elastic Stack 8.11 及以后得版本来进行安装。

在首次启动 Elasticsearch 的时候,我们可以看到如下的输出:

在上面,我们可以看到 elastic 超级用户的密码。我们记下它,并将在下面的代码中进行使用。

我们还可以在安装 Elasticsearch 目录中找到 Elasticsearch 的访问证书:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.14.1/config/certs
$ ls
http.p12      http_ca.crt   transport.p12

在上面,http_ca.crt 是我们需要用来访问 Elasticsearch 的证书。

生成 API key

在今天的配置中,我们将使用 API key 来配置 Filebeat。我们来在 Kibana 中申请一个 key:

我们点击上面的 copy 按钮来拷贝 API key:OTsKgpABdr8VH6CAEv9z:caX69H6uQ7qcWKxQxeopuQ

我们也可以使用如下的命令来活动 API key:

POST /_security/api_key
{
 "name": "filebeat-api-key",
 "role_descriptors": {
   "logstash_read_write": {
     "cluster": ["manage_index_templates", "monitor"],
     "index": [
       {
         "names": ["filebeat-*"],
         "privileges": ["create_index", "write", "read", "manage"]
       }
     ]
   }
 }
}

上面的命令将会得到如下所示的回复:

{
  "id": "OzunhZABdr8VH6CAcP_-",
  "name": "filebeat-api-key",
  "api_key": "8-DGUNfjRyu4jw4EnKs16Q",
  "encoded": "T3p1bmhaQUJkcjhWSDZDQWNQXy06OC1ER1VOZmpSeXU0anc0RW5LczE2UQ=="
}

安装 Filebeat

我们可以到地址下载 Filebeat,并加压缩来进行安装:

$ pwd
/Users/liuxg/elastic
$ ls
elasticsearch-8.14.1                       kibana-8.14.1-darwin-aarch64.tar.gz
elasticsearch-8.14.1-darwin-aarch64.tar.gz logstash-8.14.1-darwin-aarch64.tar.gz
filebeat-8.14.1-darwin-aarch64.tar.gz      metricbeat-8.14.1-darwin-aarch64.tar.gz
kibana-8.14.1
$ tar xzf filebeat-8.14.1-darwin-aarch64.tar.gz 
$ cd filebeat-8.14.1-darwin-aarch64
$ ls
LICENSE.txt            fields.yml             filebeat.yml           modules.d
NOTICE.txt             filebeat               kibana
README.md              filebeat.reference.yml module

安装命令如上所示,我们可以看到一个关于 Filebeat 的配置文件 filebeat.yml 文件。在下面的步骤中,我们将对它进行配置。

创建能生成日志的 Node.js web 应用

接下来,创建一个运行 Web 服务器并记录 HTTP 请求的基本 Node.js 脚本。

1)在安装 winston 和 ECS 格式化程序包的同一本地目录中,创建一个新文件 webserver.js 并将其保存为以下内容:

webserver.js

const http = require('http')
const winston = require('winston')
const ecsFormat = require('@elastic/ecs-winston-format')

const logger = winston.createLogger({
  level: 'debug',
  format: ecsFormat({ convertReqRes: true }),
  transports: [
    //new winston.transports.Console(),
    new winston.transports.File({
      //path to log file
      filename: 'logs/log.json',
      level: 'debug'
    })
  ]
})

const server = http.createServer(handler)
server.listen(3000, () => {
  logger.info('listening at http://localhost:3000')
})

function handler (req, res) {
 res.setHeader('Foo', 'Bar')
  res.end('ok')
  logger.info('handled request', { req, res })
}

该 Node.js 脚本在 http://localhost:3000 运行一个 Web 服务器,并使用 winston 记录器根据 HTTP 请求将日志事件发送到文件 log.json。

2)尝试运行 Node.js 脚本:

node webserver.js
$ pwd
/Users/liuxg/nodejs/nodejs-logs
$ ls
morgan-logging.js  pino-logging.js    webserver.js       winston-logging.js
$ node webserver.js 

在运行完上面的应用后,我们可以在当前的目录下看到一个叫做 logs 的子目录:

$ pwd
/Users/liuxg/nodejs/nodejs-logs
$ ls
logs               morgan-logging.js  pino-logging.js    webserver.js       winston-logging.js
$ cd logs
$ cat log.json 
{"@timestamp":"2024-07-10T03:03:14.118Z","ecs.version":"8.10.0","log.level":"info","message":"listening at http://localhost:3000"}

我们可以看到一个新生成的文件叫做 log.json 文件。它的内容如上所示。

3)脚本运行时,打开 Web 浏览器访问 http://localhost:3000,应该会出现一条简单的 ok 消息。

我们再次查看 log.json 文件的内容,它显示如下:

为了显示的更加清楚一点,我们使用如下的格式来进行显示:

4)在创建 webserver.js 的目录中,现在应该会找到一个新创建的 log.json 文件。打开文件并检查内容。应该有一个日志条目表明 Node.js 正在监听 localhost 端口,另一个条目表示你在浏览器中打开 localhost 时的 HTTP 请求。

暂时让 webserver.js 保持运行,我们将向其发送一些 HTTP 请求。

创建 Node.js HTTP 请求应用程序

在此步骤中,你将创建一个将 HTTP 请求发送到 Web 服务器的 Node.js 应用程序。

1)在你的工作目录中,创建一个文件 webrequests.js 并将其保存为以下内容:

webrequests.mjs

import got from 'got';

const addresses = [
    'aardvark@the.zoo',
    'crocodile@the.zoo',
    'elephant@the.zoo',
    'emu@the.zoo',
    'hippopotamus@the.zoo',
    'llama@the.zoo',
    'octopus@the.zoo',
    'otter@the.zoo',
    'panda@the.zoo',
    'pangolin@the.zoo',
    'tortoise@the.zoo',
    'walrus@the.zoo'
];

const method = [
    'get',
    'put',
    'post'
];

async function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

(async () => {
    while (true) {
        var type = Math.floor(Math.random() * method.length);
        var email = Math.floor(Math.random() * addresses.length);
        var sleeping = Math.floor(Math.random() * 9) + 1;

        switch (method[type]) {
            case 'get':
                try {
                    const response = await got.get('http://localhost:3000/', {
                        headers: {
                            from: addresses[email]
                        }
                    }).json();
                    console.log(response.body);
                } catch (error) {
                    console.log(error.response.body);
                }
                break; // end case 'get'
            case 'put':
                try {
                    const response = await got.put('http://localhost:3000/', {
                        headers: {
                            from: addresses[email]
                        }
                    }).json();
                    console.log(response.body);
                } catch (error) {
                    console.log(error.response.body);
                }
                break; // end case 'put'
            case 'post':
                try {
                    const {
                        data
                    } = await got.post('http://localhost:3000/', {
                        headers: {
                            from: addresses[email]
                        }
                    }).json();
                    console.log(data);
                } catch (error) {
                    console.log(error.response.body);
                }
                break; // end case 'post'
        } // end switch on method
    await sleep(sleeping * 1000);
    }
})();

此 Node.js 应用使用 GET、POST 或 PUT 类型的随机方法以及使用各种假装电子邮件地址的随机发件人请求标头生成 HTTP 请求。请求以 1 到 10 秒之间的随机间隔发送。

Got 包用于发送请求,并将它们定向到你的 Web 服务器 http://localhost:3000。要了解如何发送自定义 header(例如本例中使用的发件人字段),请查看 Got 文档中的 headers。

2)在新的终端窗口中,试运行 Node.js 脚本:

node webrequests.mjs

3)脚本运行约 30 秒后,输入 CTRL + C 停止它。查看你的 Node.js logs/log.json 文件。它应该包含一些类似这样的条目:

{"@timestamp":"2021-09-09T18:42:20.799Z","log.level":"info","message":"handled request","ecs":{"version":"1.6.0"},"http":{"version":"1.1","request":{"method":"POST","headers":{"user-agent":"got (https://github.com/sindresorhus/got)","from":"octopus@the.zoo","accept":"application/json","accept-encoding":"gzip, deflate, br","host":"localhost:3000","connection":"close","content-length":"0"},"body":{"bytes":0}},"response":{"status_code":200,"headers":{"foo":"Bar"}}},"url":{"path":"/","full":"http://localhost:3000/"},"client":{"address":"::ffff:127.0.0.1","ip":"::ffff:127.0.0.1","port":49930},"user_agent":{"original":"got (https://github.com/sindresorhus/got)"}}

每个日志条目都包含 HTTP 请求的详细信息。具体来说,在此示例中,你可以找到请求的时间戳、PUT 类型的请求方法以及带有电子邮件地址 octopus@the.zoo 的请求标头。你的示例可能会有所不同,因为请求类型和电子邮件地址是随机生成的。

使用带有 ECS 字段的 JSON 格式编写日志可以轻松解析和分析,并与其他应用程序实现标准化。随着日志中捕获的数据量和类型随时间推移而扩大,标准、易于解析的格式变得越来越重要。

4)确认 webserver.js 和 webrequests.js 都按预期运行后,输入 CTRL + C 停止 Node.js 脚本,并删除 log.json。

配置 Filebeat

Filebeat 提供了一种简单、易于配置的方法来监控你的 Node.js 日志文件并将日志数据移植到 Elasticsearch Service 中。

配置 Filebeat 访问 Elasticsearch 服务

在 <localpath>/filebeat-<version>/(其中 <localpath> 是 Filebeat 安装的目录,<version> 是 Filebeat 版本号)中,打开 filebeat.yml 配置文件进行编辑。

在 filebeat.yml 的 filebeat.inputs 部分中,将 enabled: 设置为 true,并将 paths: 设置为 Web 服务器日志文件的位置。在此示例中,设置为你保存 webserver.js 的同一目录:

提示:你可以指定通配符 (*) 来表示应读取指定目录中的所有日志文件。你还可以使用通配符从多个目录读取日志。例如 /var/log/*/*.log。

添加 JSON 输入选项

Filebeat 的输入配置选项包括几个用于解码 JSON 消息的设置。日志文件是逐行解码的,因此每行包含一个 JSON 对象非常重要。

对于此示例,Filebeat 使用以下四个解码选项。

  json.keys_under_root: true
  json.overwrite_keys: true
  json.add_error_key: true
  json.expand_keys: true

要了解有关这些设置的更多信息,请查看 Filebeat 参考中的 JSON 输入配置选项和解码 JSON 字段。

将四个 JSON 解码选项附加到 filebeat.yml 的 Filebeat 输入部分,以便该部分现在如下所示:

完成 Filebeat 的设置

截止此时,我们已经配置了我们所需要的一切。在下面,我们可以开始我们的展示了。

Filebeat 附带预定义资产,用于解析、索引和可视化数据。要加载这些资产,请从 Filebeat 安装目录运行以下命令:

./filebeat setup -e

重要:根据安装位置、环境和本地权限等变量,你可能需要更改 filebeat.yml 的所有权。你还可以尝试以 root 身份运行该命令:sudo ./filebeat setup -e,或者你可以通过运行带有 --strict.perms=false 选项的命令来禁用严格权限检查。

设置过程需要几分钟。如果一切顺利,你将收到一条确认消息:

Loaded Ingest pipelines

Filebeat data view(以前称为 index pattern)现在可在 Elasticsearch 中使用。我们可以在 Kibana 中进行查看:

发送 Node.js 日志到 Elasticsearch

启动 Node.js 应用

我们使用如下的命令来启动 webserver.js:

node webserver.js 

我们使用如下的命令来启动请求应用:

node webrequests.mjs

启动 Filebeat 和 webserver.js

通过从 Filebeat 安装目录运行以下命令来启动 Filebeat:

./filebeat -e -c filebeat.yml

在上面的命令中:

  • -e 标志将输出发送到标准错误而不是配置的日志输出。
  • -c 标志指定 Filebeat 配置文件的路径。

为了验证我们已经收到数据,我们可以做如下的检查:

我们可以看到所有的字段。

我们可以在 Kibana DevTools 中查看收集到的数据:

我们可以看到日志数量的编辑已经日志的一些相关信息。

为日志创建可视化

在这里,我们可以针对数据来做一下简单的可视化:

这样就生成了第一个可视化图。

接下来,我们来创建第二个可视化图。点击上面的 Create visualization 按钮:

这样就创建了第二个可视化图。

我们接下来创建第三个可视化图:

这样我们就创建了第三个可视化图。

现在,你已经了解如何从 Node.js Web 应用程序监控日志文件,将日志事件数据安全地传送到 Elasticsearch Service 部署中,然后实时在 Kibana 中可视化结果。请参阅 Filebeat 文档,详细了解可用于数据的提取和处理选项。你还可以浏览我们的文档,了解有关在 Elasticsearch Service 中工作的所有信息。

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

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

相关文章

three-tile: 1. 第一个three-tile程序

上篇介绍了&#xff1a;three-tile&#xff1a; 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&…

Spark-RDD和共享变量

概览 每个Spark应用程序都由一个driver program 组成&#xff0c;该驱动程序运行我们编写的main函数&#xff0c;并在集群上执行各种 并行 操作。Spark提供的主要抽象是一个 弹性分布式数据集&#xff08;RDD&#xff09;&#xff0c;它是一个跨集群节点分区的元素集合&#x…

maven7——(重要,构建项目)maven项目构建(命令)

Maven的常用命令管理项目的生命周期 clean命令 清除编译产生的target文件夹内容&#xff0c;可以配合相应命令在cmd中使用&#xff0c;如mvn clean package&#xff0c; mvn clean test D:\工作\公司培训-4班\day20\day20\untitled1>mvn clean compile命令 该命令可以…

Nginx: Rewrite功能配置/Nginx反向代理/Nginx的安全控制SSL

Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安…

[ICS] Inferno(地狱) ETH/IP未授权访问,远程控制工控设备利用工具

项目地址:https://github.com/MartinxMax/Inferno Inferno $ ./Install.sh $ python Inferno.py -h 模拟服务端 $ sudo python3 -m pip install --upgrade cpppo $ $ python -m cpppo.server.enip SCADAINT[1000] ADMININT[2] -v 创建一个EtherNet/IP设备 扫描设备 $ pyth…

【网络安全】Oracle:SSRF获取元数据

未经许可&#xff0c;不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司&#xff0c;拥有庞大的客户群体。与许多大型运营公司一样&#xff0c;Acme 采用了Apiary的服务&#xff0c;使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…

【Django项目】基于Python+Django+MySQL的音乐网站系统项目

功能介绍 首页&#xff1a;歌曲分类、歌曲搜索、热门歌曲、热门下载、新歌推荐 歌曲排行&#xff1a;歌曲分类、分页功能 用户板块&#xff1a;用户登陆/注册、播放历史 歌曲详情&#xff1a;歌曲播放、当前播放列表、歌曲点评、歌曲播放插件、下载歌曲 系统后台&#xff1a;歌…

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时&#xff0c;尤其是在国内环境下&#xff0c;由于网络原因&#xff0c;从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度&#xff0c;我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

docker(六)--创建镜像

六、创建镜像 1.创建镜像两种方式 方式1&#xff1a; 更新镜像 docker commit 方式2&#xff1a;构建镜像 docker build 2.更新镜像 1&#xff09;用法 docker commit -m“描述信息” -a作者 容器id或者容器名 镜像名:tag 2&#xff09;步骤 ①根据镜像运行容器 ②进入容…

栈和队列题目详解

前言&#xff1a; 在前面我们学习了栈和队列&#xff0c;栈的特性是后进先出&#xff0c;队列的特性是先进先出&#xff0c;当我们了解了这些之后&#xff0c;我们就可以用到栈和队列的特性来简单的做一些题目了。 1. 有效的括号 有效的括号&#xff1a;. - 力扣&#xff08…

YOLOv10改进 | Conv篇 | 利用FasterBlock二次创新C2f提出一种全新的结构(全网独家首发,参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络&#xff0c;将其用来改进ResNet网络&#xff0c;其旨在提高计算速度而不牺牲准确性&#xff0c;特别是在视觉任务中。它通过一种称为部分卷积&#xff08;PConv&#xff09;的新技术来减少…

火柴棒图python绘画

使用Python绘制二项分布的概率质量函数&#xff08;PMF&#xff09; 在这篇博客中&#xff0c;我们将探讨如何使用Python中的scipy库和matplotlib库来绘制二项分布的概率质量函数&#xff08;PMF&#xff09;。二项分布是统计学中常见的离散概率分布&#xff0c;描述了在固定次…

夏日智启:我的Datawhale AI夏令营探索之旅

前言 最近几年&#xff0c;AI&#xff08;人工智能&#xff09;的发展呈现出了前所未有的迅猛势头&#xff0c;其影响力和应用范围不断扩大&#xff0c;深刻地改变着我们的生活、工作和社会结构。尤其是AI大模型技术&#xff0c;国内外可谓是“百模大战”&#xff0c;百舸争流…

ESP32网络开发:1.创建一个基于TCP网络协议的网站

一、TCP协议的介绍 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;是互联网协议套件中的一种核心协议&#xff0c;主要用于在网络中的计算机之间可靠地传输数据。TCP协议位于OSI模型&#xff08;开放系统互联模型&#xff09;的传输层&…

虚拟机内安装vue-dev-tools

前言 项目开发调试都需要在Citrix在虚拟机环境下&#xff0c;Citrix内连接不到外网&#xff0c;在这边文章&#xff0c;我将介绍自己在Citrix环境内安装 vue-dev-tools的经验 环境 vue 步骤 1. 下载.crx文件 百度网盘里的 .crx文件的 下载链接 2. 加载.crx文件 打开浏览…

软件兼容性测试重要吗?有哪些测试流程和注意事项?

软件兼容性测试是指测试软件在不同硬件、操作系统、网络环境和软件环境下的稳定性和可用性的能力&#xff0c;也就是说&#xff0c;软件在不同的平台上是否能正常运行&#xff0c;是否能与其他软件和系统兼容。 兼容性问题是影响软件用户体验的重要因素之一&#xff0c;如果软…

学习大数据DAY13 PLSQL基础语法2

目录 选择结构 IF语句 简单判断语句 带判断不成立语句 多判断语句 IF语句注意事项&#xff1a; CASE 语句 简单CASE语句 搜索型CASE语句 作业 循环语句 循环结构 简单循环 属性 描述 位置 场景 WHILE循环 属性 FOR循环 数值型for循环 数值型for循环的特性…

【Redis】简单了解Redis中常用的命令与数据结构

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、Redis的特点和适用场景三、Redis的数据类型和使用3.1字符串&#xff08;String&…

谷粒商城实战笔记-24-分布式组件-SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组

文章目录 一&#xff0c;命名空间1&#xff0c;简介1.1&#xff0c;命名空间的主要功能和特点1.2&#xff0c;使用场景1.3&#xff0c;如何指定命名空间 2&#xff0c;命名空间实战2.1&#xff0c;环境隔离2.2&#xff0c;服务隔离 二&#xff0c;配置集三&#xff0c;配置集ID…