ELK企业级日志分析

news2024/9/21 16:19:06

目   录

一、ELK简介

1.1 elasticsearch简介

1.2 logstash简介

1.3 kibana简介

1.4 ELK的好处

1.5 ELK的工作原理

二、部署ELK

2.1 部署elasticsearch(集群)

2.1.1 修改配置文件

2.1.2 修改系统参数

2.1.2.1 修改systemmd服务管理器

2.1.2.2 性能调优参数

2.1.2.3 修改内核参数

2.1.3 重启系统,开启elasticsearch服务

2.1.4 浏览器中插件elasticsearch

2.2 部署logstash

2.3 部署kibana图形化工具

三、管理nginx日志

四、管理tomcat日志


一、ELK简介

ELK是由elasticsearch+logstash+kibana三个开源软件的组成的一个组合体,对收集、分析和展示的企业级解决方案,主要优点有:

处理灵活:elasticsearch是实时全文索引,具有强大的搜索功能配置相对简单,API接口使用json接口,logstash使用模块配置,kibana的配置文件部分更简单。

检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百万亿级数据的查询秒级响应。集群线性扩展:elasticsearch和logstash都可以灵活线性扩展。

前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单。

1.1 elasticsearch简介

elasticsearch是一个高度可扩展性的开源全文索引和分析引擎,它可实现数据的实时全文搜索。

搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如nginx,tomcat,系统日志等功能。

使用java语言开发,建立在全文搜索引擎Apache lucene基础之上的搜索引擎

特点:

实时搜索、实时分析

分布式架构、实时文件存储

文档导向,所有对象都是文档

高可用,易扩展,支持集群,分片与分配

接口友好,支持json

1.2 logstash简介

Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。

1.3 kibana简介

Kibana 为 elasticsearch 提 供 一 个 查 看 数 据 的 web 界 面 , 其 主 要 是 通 过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。

1.4 ELK的好处

ELK组件在大数据运维系统中,主要可解决的问题:

日志查询,问题排查,故障恢复,故障自愈

应用日志分析,错误报警

性能分析,用户行为分析

1.5 ELK的工作原理

(1)在所有需要收集日志的服务器上部署logstash,或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署logstash。

(2)logstash收集日志,将日志格式化并输出到elasticsearch群集中。

(3)elasticsearch对格式化后的数据进行索引和存储

(4)kibana从ES群集中查询数据生成图表,并进行前端数据的展示。

总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交给elasticsearch存储,kibana对日志进行可视化处理。

二、部署ELK

全部的服务器配置,所有服务器不低于4G内存

服务器环境角色:三台机子

7-1(Node1)和7-2(Node2)作为elasticsearch存储数据。集群

7-3Node3作为收集日志服务器。


Node1:192.168.114.10

Node2:192.168.114.20

Node3:192.168.114.30

前期准备:

systemctl stop firewalld

setenforce 0

都需要java环境,先安装java:

yum install -y java

创建存放源码包的目录:

mkdir /data ; cd /data

2.1 部署elasticsearch(集群)

两台服务器配置一致,后面只需要修改一个地方,名字不同。

以下没有指定说明,主机Node2也同样的操作。

准备rpm包,拖进来。

[root@Node1 data]#:ls
elasticsearch-6.7.2.rpm

解压:rpm -ivh elasticsearch-6.7.2.rpm

[root@Node1 data]#:rpm -ivh elasticsearch-6.7.2.rpm

2.1.1 修改配置文件

进入配置文件的路径,修改配置文件,先备份

[root@Node1 data]#:cd /etc/elasticsearch/
[root@Node1 elasticsearch]#:cp -a elasticsearch.yml elasticsearch.yml.bak
[root@Node1 elasticsearch]#:vim elasticsearch.ym
#做出以下修改,前面数字是行号。
17:cluster.name: my-elk-cluster
23:node.name: node1
24:node.master: true
25:node.data: true
35:path.data: /var/lib/elasticsearch
39:path.logs: /var/log/elasticsearch
45:bootstrap.memory_lock: true
57:network.host: 0.0.0.0
61:http.port: 9200
62:transport.tcp.port: 9300    #手动添加,集群,主机之间通过9300端口相连
71:discovery.zen.ping.unicast.hosts: ["192.168.114.10:9300", "192.168.114.20:9300"]  #集群的IP地址,Node1和Node2的IP

过滤出看下修改的地方:

在这个配置文件中,第23行,名字不能一样,这个配置文件,可以远程拷贝到Node2

修改Node2的node.name名字为node2

2.1.2 修改系统参数

2.1.2.1 修改systemmd服务管理器

/etc/systemd/system.conf文件用于配置systemd的,这是一种用于linux操作系统的系统和服务管理器。通过这个文件,你可以自定义与系统操作、性能和行为相关的各种设置。在最后添加配置项:

DefaultLimitNOFILE=65536                #设置打开文件数量的默认限制
DefaultLimitNPROC=32000                #设置进程数量的默认限制
DefaultLimitMEMLOCK=infinity           #内存锁

[root@Node1 elasticsearch]#:vim /etc/systemd/system.conf
......
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
2.1.2.2 性能调优参数

最后添加

[root@Node1 elasticsearch]#:vim /etc/security/limits.conf
......
*  soft    nofile          65536
*  hard    nofile          65536
*  soft    nproc           32000
*  hard    nproc           32000
*  soft    memlock         unlimited
*  hard    memlock         unlimited

2.1.2.3 修改内核参数

一个进程可以拥有的最大内存映射区域数。(分配:2g/262144,4g/4194304,8g/8388608)


[root@Node1 elasticsearch]#:vim /etc/sysctl.conf
......
vm.max_map_count=262144
[root@Node1 elasticsearch]#:sysctl -p
vm.max_map_count = 262144

2.1.3 重启系统,开启elasticsearch服务

reboot

重启后别忘记防火墙和核心防护

systemctl stop firewalld

setenforce 0

 开启服务:

[root@Node2 ~]#:systemctl start elasticsearch.service 
[root@Node2 ~]#:systemctl status elasticsearch.service 
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2024-07-17 17:01:10 CST; 4s ago
     Docs: http://www.elastic.co
 Main PID: 3165 (java)
    Tasks: 17
   CGroup: /system.slice/elasticsearch.service
           └─3165 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFrac...

7月 17 17:01:10 Node2 systemd[1]: Started Elasticsearch.

查看端口号:

9300是集群中与另一台Node2连接的端口。Node2上同理:

这样服务就起来了,elasticsearch集群。

去主机查看节点状态

192.168.114.10:9200

192.168.114.20:9200

查看群集的健康情况,可以看到status值为green(绿色),表示节点健康运行

192.168.114.10:9200/_cluster/health?pretty
192.168.114.20:9200/_cluster/health?pretty

2.1.4 浏览器中插件elasticsearch

在谷歌浏览器中下载插件,也可以在其他浏览器上找插件。

插件下载:点击谷歌浏览器右上角三个点(更多)->找到扩展程序,找到管理扩展程序->在搜索栏中搜索elasticsearch。点击下载。

下载好,在右上角点击插件,能够看到我们下载的插件,Multi Elasticsearch Head。

点击。

打开插件后,点击new,在弹出的数据框中数据http://192.168.114.10:9200

点击确定。

 可以看到集群健康值为green。有两个节点,我们自定义的名字。

这个插件如果装不起来,也可以在本机默认浏览器试试这个地址下载插件:https://www.chajianxw.com/

2.2 部署logstash

logstash是部署在应用服务器Node3上的,用于手机日志文件

准备源码包:

[root@Node3 data]#:ls
kibana-6.7.2-x86_64.rpm  logstash-6.7.2.rpm

解压logstash:

[root@Node3 data]#:rpm -ivh logstash-6.7.2.rpm

启动服务:

[root@Node3 data]#:systemctl start logstash.service 
[root@Node3 data]#:systemctl status logstash.service 
● logstash.service - logstash
   Loaded: loaded (/etc/systemd/system/logstash.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2024-07-17 18:21:36 CST; 6s ago
 Main PID: 7425 (java)
    Tasks: 17
   CGroup: /system.slice/logstash.service
           └─7425 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFrac...

7月 17 18:21:36 Node3 systemd[1]: Started logstash.

为了能够补全logstash命令,做个软链接:

[root@Node3 data]#:ln -s /usr/share/logstash/bin/logstash /usr/bin

可以直接logstash命令执行了,不用再绝对路径了

logstash命令选项:

-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作Logstash的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t:测试配置文件是否正确,然后退出。

可以本地测试一下,标准输入标准输出:logstash -e 'input { stdin{} } output { stdout {} }'

[root@Node3 data]#:logstash -e 'input { stdin{} } output { stdout {} }'
......
[INFO ] 2024-07-17 18:27:54.353 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2024-07-17 18:27:54.806 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
#此处输入

由于是本地输入输出并不会在插件上显示。 看到successfully

ctrl + C退出。

如果想要使用logstash将信息写入elasticsearch中,需要执行elasticsearch块,指定主机。

[root@Node3 data]#:logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.114.10:9200"] } }'
......
[INFO ] 2024-07-17 18:33:39.014 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2024-07-17 18:33:39.610 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
#输入内容

这里输入内容并不会向上面那样,因为我们指定了output是elasticsearch插件中,并指定了输出的主机为192.168.114.10。

我们去谷歌浏览器刷新一下:在概览中发现多了一项。

那么怎么查看我们输入的内容呢?上面一栏中有个数据浏览,点击。

有个索引为logstash,后跟日期,是以json格式显示出来的,能明显在message键中看到值为hello world!!!的内容。

除此之外!一般都是用配置文件,来输入输出内容。

进入配置文件:

[root@Node3 data]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:ls
[root@Node3 conf.d]#:

创建一个系统日志的配置文件。固定格式

[root@Node3 conf.d]#:vim system-log.conf
input {
        file {
                path => "/var/log/messages"
                type => "system"
                start_position => "beginning"
        }
}
output {
        elasticsearch {
                hosts => [ "192.168.114.10:9200","192.168.114.20:9200"]
                index => "system-%{+YYYY.MM.dd}"
        }
}

input指定本地的输入文件,path路径,tpye类型,start_position从当前开始。output输出到哪里,elasticsearch插件,hosts集群中的IP地址,index索引输出的格式

但是我们path路径下的messages这个日志文件要具有读的权限。

启动logstash:logstash -f system-log.conf

[root@Node3 conf.d]#:logstash -f system-log.conf 
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
......
[INFO ] 2024-07-17 18:50:09.998 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 18:50:10.386 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}

看到successfully成功后,去浏览器上查看。

我们指定的索引名字,systemctl+日期。年.月.日

我们的配置文件中指定了格式:index => "system-%{+YYYY.MM.dd}"

查看数据浏览:在右侧能够看到/var/log/messages文件中的所有日志信息。

这里太多了,于是就又出现了一个图形化界面的工具。kibana

2.3 部署kibana图形化工具

解压kibana,进入配置文件。

[root@Node3 data]#:rpm -ivh kibana-6.7.2-x86_64.rpm 
警告:kibana-6.7.2-x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:kibana-6.7.2-1                   ################################# [100%]
[root@Node3 data]#:cd /etc/kibana/
[root@Node3 kibana]#:ls
kibana.yml

修改配置文件,先做个备份。

修改以下配置项。

[root@Node3 kibana]#:cp -a kibana.yml kibana.yml.bak
[root@Node3 kibana]#:vim kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.114.10:9200","http://192.168.114.20:9200"]
kibana.index: ".kibana"
logging.dest: /var/log/kibn.log
i18n.locale: "zh-CN"

查看修改了哪些,在第几行。

-v反选:过滤注释行和空行。反选了,除此之外的行

-n显示行号

-E开启扩展正则表达式

[root@Node3 kibana]#:grep -vnE "^#|^$" kibana.yml
2:server.port: 5601                        #第2行,打开端口
7:server.host: "0.0.0.0"                       #第7行,监听地址
28:elasticsearch.hosts: ["http://192.168.114.10:9200","http://192.168.114.20:9200"]        #集群服务器
37:kibana.index: ".kibana"                #打开索引
96:logging.dest: /var/log/kibn.log        #指定日志文件,这个日志文件需要手动创建
113:i18n.locale: "zh-CN"                #中文设置

创建日志,修改属主属组,启动服务,查看状态。

看端口:是起来的

图形化工具安装成功。在浏览器输入:

192.168.114.30:5601

使用:

点击自己浏览

点discover:

 成功,搜索到一个索引。点下一步

 按时序排序,点创建索引模式

 看到一个索引。

 查看索引。

 查看我们所需要的字段。

三、管理nginx日志

在Node3上安装nginx服务。

安装epel源和nginx。

[root@Node3 kibana]#:yum install -y epel-release.noarch
[root@Node3 kibana]#:yum install -y nginx

修改日志格式为json格式。

把原本的日志格式注释,添加自定义的格式:json格式

http {
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log  /var/log/nginx/access.log  access_json;
......
}

启动nginx:

[root@Node3 kibana]#:systemctl start nginx

使用其他主机访问nginx:

[root@Node4 ~]#:curl 192.168.114.30

在Node3上查看日志:

日志为json格式了。接下来做logstash。

修改logstash配置文件。

[root@Node3 kibana]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:ls
system-log.conf
[root@Node3 conf.d]#:vim nginx-log.conf
input {
        file {
                path => "/var/log/nginx/access.log"
                type => "nginx"
                start_position => "beginning"
                stat_interval => "3"
                codec => "json"
        }
}
output {
        elasticsearch {
                hosts => ["192.168.114.10:9200","192.168.114.20:9200"]
                index => "nginx-log-%{+YYYY.MM.dd}"
        }
}

解释:

stat_interval指定每三秒刷新一次

codec指定json格式

这个日志文件要具有读的权限:

执行logstash。看到successfully

[root@Node3 conf.d]#:logstash -f nginx-log.conf
......
[INFO ] 2024-07-17 22:24:14.244 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 22:24:14.564 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}

然后去浏览器刷新页面能看到索引为nginx-log-[时间]

也可以在kibana图形化页面添加索引:

第二步就是选择时序:

创建好之后,点击discover,可以看到日志:

我们添加一个字段,查看状态;

用Node2:192.168.114.20访问nginx:故意访问一个错误页面

刷新一下,查看状态。

下面的tomcat也一样:

四、管理tomcat日志

tomcat的安装略。我这里直接跑脚本了。

同理,tomcat先去修改脚本格式,改为json格式。修改最后一行。

[root@Node3 data]#:cd /usr/local/tomcat/conf/
[root@Node3 conf]#:vim server.xml
......
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="tomcat_access_log" suffix=".log"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}" />

directory存放目录可以不改

prefix改成tomcat开头

suffix改成log结尾

重启:

[root@Node3 conf]#:systemctl restart tomcat.service
[root@Node3 conf]#:ss -natp | grep 8080
LISTEN     0      100       [::]:8080                  [::]:*                   users:(("java",pid=6484,fd=56))

重启后有了配置文件:

使用另一台访问tomcat:curl 192.168.114.30:8080

 故意访问错误页面

查看一下日志:

修改配置文件:

[root@Node3 logs]#:cd /etc/logstash/conf.d/
[root@Node3 conf.d]#:vim tomcat_access_log.conf
input {
        file {
        path => "/usr/local/tomcat/logs/tomcat_access_log.*.log"
        type => "tomcat-acceslog"
        start_position => "beginning"
        stat_interval => "3"
        codec => "json"
        }
}
output {
        elasticsearch {
                hosts => ["192.168.114.10:9200","192.168.114.20:9200"]
                index => "tomcat-access-log-%{+YYYY.MM.dd}"
        }
}

启动logstash:

[root@Node3 conf.d]#:logstash -f tomcat_access_log.conf
......
[INFO ] 2024-07-17 23:37:04.297 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2024-07-17 23:37:04.618 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9601}

去页面刷新:

去图形化界面:

同样方式,去管理创建索引。tomcat关键字

去discover查看:

与nginx查询字段同理,添加字段。

可以根据需求,选择相应的字段。查看日志。

---end---

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络和安全操作

一、编辑文件 文本编辑器有很多&#xff0c;比如图形模式的gedit、OpenOffice 等&#xff0c;文本模式下的编辑器有vi、vim&#xff08;vi的增强版本&#xff09;等。vi和vim是我们在Linux中最常用的编辑器。 gedit&#xff1a;类似于windows下的记事本&#xff0c;很方便的去…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…

数据结构之跳表SkipList、ConcurrentSkipListMap

概述 SkipList&#xff0c;跳表&#xff0c;跳跃表&#xff0c;在LevelDB和Lucene中都广为使用。跳表被广泛地运用到各种缓存实现当中&#xff0c;跳跃表使用概率均衡技术而不是使用强制性均衡&#xff0c;因此对于插入和删除结点比传统上的平衡树算法更为简洁高效。 Skip lis…

ROS参数服务器理论模型

ROS参数服务器理论模型 参数服务器角色实现参数服务器流程参数可以使用的类型 参数服务器角色 参数服务器实现是最为简单的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (参数设置者)Listener (参数调用者) 实现参数服务器流程 整个流…

“论企业集成平台的理解与应用”,软考高级论文,系统架构设计师论文

论文真题 企业集成平台&#xff08;Enterprise Imtcgation Plaform,EIP)是支特企业信息集成的像环境&#xff0c;其主要功能是为企业中的数据、系统和应用等多种对象的协同行提供各种公共服务及运行时的支撑环境。企业集成平台能够根据业务模型的变化快速地进行信息系统的配置…

业务能力构建设计规划咨询项目(48页PPT)

业务能力构建设计规划咨询项目旨在为企业提供全面系统的指导与支持&#xff0c;通过48页PPT详细阐述如何从零开始建立起一套高效的业务体系。该项目将首先识别企业的核心竞争力&#xff0c;分析市场需求和内部资源配置&#xff0c;制定出切实可行的战略规划。 从流程优化、技术…

图片如何去水印,PS 图片去水印的几种常见方法

在数字图像的世界里&#xff0c;水印常常被用来标识版权或防止未经授权的使用&#xff0c;但有时它们却成为了美观的障碍。无论是出于个人偏好还是专业需求&#xff0c;去除图片上的水印已经成为一项常见的任务。 Adobe Photoshop 作为行业标准的图像编辑软件&#xff0c;提供…

Golang | Leetcode Golang题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; func searchMatrix(matrix [][]int, target int) bool {m, n : len(matrix), len(matrix[0])x, y : 0, n-1for x < m && y > 0 {if matrix[x][y] target {return true}if matrix[x][y] > target {y--} else {x}}return f…

卸载linux 磁盘的内容,磁盘占满

Linux清理磁盘 https://www.cnblogs.com/siyunianhua/p/17981758 当前文件夹下&#xff0c;数量 ls -l | grep "^-" | wc -l ls -lR | grep "^-" | wc -l 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找…

【简单介绍Gitea】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

第十四届蓝桥杯省赛C++C组A题【求和】题解(AC)

法一 用 for 循环计算序列和。 法二 使用等差数列求和公式。 #include <iostream> #include <algorithm> #include <cstring>using namespace std;typedef long long LL;int main() {LL res 0;for (int i 1; i < 20230408; i )res i;cout <<…

自定义View(8)View的绘制流程

安卓UI的重点之一就是View的绘制流程&#xff0c;经常出现在面试题中。熟悉View的绘制流程&#xff0c;不仅能轻松通过View相关的面试&#xff0c;也可以让我们更加方便的使用自定义View以及官方View。此篇先以常见面试题为切入点&#xff0c;说明自定义View的重要性&#xff0…

Qt Style Sheets-设计器集成

设计器集成 Qt Designer&#xff08;Qt Designer&#xff09;是一个出色的工具&#xff0c;用于预览样式表。您可以在 Designer 中右键单击任何小部件&#xff0c;并选择“更改样式表...”来设置样式表。 在 Qt 4.2 及更高版本中&#xff0c;Qt Designer 还包括一个样式表语法…

Unity Apple Vision Pro 开发(四):体积相机 Volume Camera

文章目录 &#x1f4d5;教程说明&#x1f4d5;教程内容概括&#x1f4d5;体积相机作用&#x1f4d5;创建体积相机&#x1f4d5;添加体积相机配置文件&#x1f4d5;体积相机配置文件参数&#x1f4d5;体积相机的边界盒大小&#x1f4d5;体积相机边界盒大小和应用边界盒大小的区别…

Redis 教程:从入门到入坑

目录 1. Redis 安装与启动1.1. 安装 Redis1.1.1. 在Linux上安装1.1.2. 在Windows上安装 1.2. 启动 Redis1.2.1. 在Linux上启动1.2.2. 在Windows上启动 1.3. 连接Redis1.3.1. 连接本地Redis1.3.2. 连接远程Redis1.3.2.1. 服务器开放端口1.3.2.2. 关闭防火墙1.3.2.3. 修改配置文件…

内网对抗-隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案

知识点&#xff1a; 1、隧道技术篇-网络层-ICMP协议-判断&封装&建立&穿透 2、隧道技术篇-传输层-DNS协议-判断&封装&建立&穿透 3、隧道技术篇-表示层-SMB协议-判断&封装&建立&穿透0、不是有互联网才叫出网 1、C2常见上线采用的协议 2、常…

Android:将自定义视图设为互动式

一、简介 点击查看将自定义视图设为互动式官网文档 绘制界面只是创建自定义视图的一个部分。您还需要让视图以非常类似于您模仿的真实操作的方式响应用户输入。 让应用中的对象的行为方式与真实对象相似。例如&#xff0c;不要让应用中的图片消失后重新出现在其他位置&#x…

1.厦门面试

1.Vue的生命周期阶段 vue生命周期分为四个阶段 第一阶段&#xff08;创建阶段&#xff09;&#xff1a;beforeCreate&#xff0c;created 第二阶段&#xff08;挂载阶段&#xff09;&#xff1a;beforeMount&#xff08;render&#xff09;&#xff0c;mounted 第三阶段&#…

基于Transformer模型的谣言检测系统的实现

新书速览|PyTorch深度学习与企业级项目实战-CSDN博客 谣言检测系统项目背景 1938年10月30日的晚上&#xff0c;哥伦比亚广播公司照例安排了广播剧&#xff0c;当晚的节目是根据HG威尔斯《世界之战》改编的“火星人进攻地球”。为提升吸引力&#xff0c;制作团队选择以类纪实风…

C# 智慧大棚nmodbus4

窗体 &#xff1a;图表&#xff08;chart&#xff09;&#xff1a; 下载第三方&#xff1a; nmodbus4:可以实现串口直连&#xff0c;需要创建串口对象设置串口参数配置Serialport 如果需要把串口数据表通过tcp进行网口传递 需要创建tcpclient对象 ModbusSerialMaster master; /…