遵義城鄉(xiāng)建設(shè)網(wǎng)站百度客服人工電話
目錄
一、ELK 架構(gòu)面臨的問題
1.1 耦合度過高
1.2 性能瓶頸
二、ELK 對(duì)接 Redis 實(shí)踐
2.1 配置 Redis
2.1.1 安裝 Redis
2.1.2 配置 Redis
2.1.3 啟動(dòng) Redis
2.2 配置 Filebeat?
2.3 配置 Logstash
2.4 數(shù)據(jù)消費(fèi)
2.5 配置 kibana
三、消息隊(duì)列基本概述
3.1?什么是消息隊(duì)列
3.2?消息隊(duì)列的分類
3.3?消息隊(duì)列使用場(chǎng)景
3.3.1 解耦
3.3.2 異步
3.3.3 削峰
四、Kafka 概述及集群部署
4.1 Kafka 集群安裝
4.2 Zookeeper 集群安裝?
五、Kafka-eagle 圖形界面安裝
5.1 安裝 JDK?
5.2 安裝 Kafka-eagle
5.3 配置 Kafka-eagle
5.4 啟動(dòng)?Kafka-eagle
5.5 開啟 eagle 監(jiān)控
5.6 訪問 Kafka-eagle
5.7 遇到的小坑?
六、ELK 對(duì)接 Kafka
6.1 配置 Filebeat?
6.2 配置 Logstash
6.3 配置 kibana
一、ELK 架構(gòu)面臨的問題
1.1 耦合度過高
????????場(chǎng)景說明:假設(shè)目前系統(tǒng)日志輸出很頻繁,十分鐘大約 5Gb,那么一個(gè)小時(shí)就是 30Gb;而應(yīng)用服務(wù)器的存儲(chǔ)空間一般默認(rèn) 40Gb,所以通常會(huì)對(duì)應(yīng)用服務(wù)器日志按小時(shí)輪轉(zhuǎn)。如果我們的Logstash 故障了 1 小時(shí),那么 Filebeat 就無法向 Logstash 發(fā)送日志,但我們的應(yīng)用服務(wù)器每小時(shí)會(huì)對(duì)日志進(jìn)行切割,那么也就意味著我們會(huì)丟失 1 小時(shí)的日志數(shù)據(jù)。
????????解決方法:使用消息隊(duì)列,只要你的 filebeat 能夠收集日志,隊(duì)列能夠存儲(chǔ)足夠長(zhǎng)時(shí)間的數(shù)據(jù),那后面 logstash 故障了,也不用擔(dān)心,等 Logstash 修復(fù)后,日志依然能正常寫入,也不會(huì)造成數(shù)據(jù)丟失,這樣就完成了解耦。
1.2 性能瓶頸
????????場(chǎng)景說明:使用 filebeat 或 logstash 直接寫入ES,那么日志頻繁的被寫入 ES 的情況下,可能會(huì)造成 ES 出現(xiàn)超時(shí)、丟失等情況。因?yàn)?ES 需要處理數(shù)據(jù),存儲(chǔ)數(shù)據(jù),所以性能會(huì)變的很緩慢。
????????解決辦法:使用消息隊(duì)列,filebeat 或 Logstash 直接寫入消息隊(duì)列中就可以了,因?yàn)殛?duì)列可以起到一個(gè)緩沖作用,最后我們的 logstash 根據(jù)?ES 的處理能力進(jìn)行數(shù)據(jù)消費(fèi),勻速寫入 ES 集群,這樣能有效緩解 ES 寫入性能的瓶頸。
二、ELK 對(duì)接 Redis 實(shí)踐
使用 Redis 充當(dāng)消息隊(duì)列服務(wù):
2.1 配置 Redis
2.1.1 安裝 Redis
生產(chǎn)環(huán)境中使用二進(jìn)制安裝 Redis:?CentOS 7 詳細(xì)安裝 Redis 6 圖文教程_centos 7安裝redis6需要哪些環(huán)境依賴_Stars.Sky的博客-CSDN博客
此次實(shí)驗(yàn)環(huán)境中我們使用 yum 安裝更方便快捷:
[root@es-node2 ~]# yum install -y redis
2.1.2 配置 Redis
[root@es-node2 ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass Qwe123456
2.1.3 啟動(dòng) Redis
[root@es-node2 ~]# systemctl enable --now redis
2.2 配置 Filebeat?
[root@se-node3 ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log # 收集日志的類型enabled: true # 啟用日志收集paths:- /var/log/nginx/access.log # 日志所在路徑tags: ["access"]- type: log # 收集日志的類型enabled: true # 啟用日志收集paths:- /var/log/nginx/error.log # 日志所在路徑tags: ["error"]output.redis:hosts: ["192.168.170.133:6379"] # redis地址password: "Qwe123456" #redis密碼timeout: 5 #連接超時(shí)時(shí)間db: 0 #寫入db0庫中keys: #存儲(chǔ)的key名稱- key: "nginx_access"when.contains:tags: "access"- key: "nginx_error"when.contains:tags: "error"[root@se-node3 ~]# systemctl restart filebeat.service
2.3 配置 Logstash
[root@es-node1 ~]# vim /etc/logstash/conf.d/test6.conf
input {redis {host => ["192.168.170.133"]port => "6379"password => "Qwe123456"data_type => "list"key => "nginx_access"db => "0"}redis {host => ["192.168.170.133"]port => "6379"password => "Qwe123456"data_type => "list"key => "nginx_error"db => "0"}
}filter {if "access" in [tags][0] {grok {match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:hostname} (?:%{QS:referrer}|-) (?:%{NOTSPACE:post_args}|-) %{QS:useragent} (?:%{QS:x_forward_for}|-) (?:%{URIHOST:upstream_host}|-) (?:%{NUMBER:upstream_response_code}|-) (?:%{NUMBER:upstream_response_time}|-) (?:%{NUMBER:response_time}|-)" }}useragent {source => "useragent"target => "useragent"}geoip {source => "clientip"}date {match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"timezone => "Asia/Shanghai"}mutate {convert => ["bytes","integer"]convert => ["response_time", "float"]convert => ["upstream_response_time", "float"]remove_field => ["message"]add_field => { "target_index" => "redis-logstash-nginx-access-%{+YYYY.MM.dd}" } }# 提取 referrer 具體的域名 /^"http/if [referrer] =~ /^"http/ {grok {match => { "referrer" => '%{URIPROTO}://%{URIHOST:referrer_host}' }}}# 提取用戶請(qǐng)求資源類型以及資源 ID 編號(hào)if "sky.com" in [referrer_host] {grok {match => { "referrer" => '%{URIPROTO}://%{URIHOST}/(%{NOTSPACE:sky_type}/%{NOTSPACE:sky_res_id})?"' }}}}else if "error" in [tags][0] {date {match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"timezone => "Asia/Shanghai"}mutate {add_field => { "target_index" => "redis-logstash-nginx-error-%{+YYYY.MM.dd}" }}}
}output {stdout {codec => rubydebug}elasticsearch {hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]index => "%{[target_index]}"template_overwrite => true}
}[root@es-node1 ~]# logstash -f /etc/logstash/conf.d/test6.conf -r
2.4 數(shù)據(jù)消費(fèi)
????????在上面描述的場(chǎng)景中,Filebeat 收集的日志文件數(shù)據(jù)會(huì)被存儲(chǔ)到 Redis。接著,Logstash 從 Redis 中獲取數(shù)據(jù)并將其傳輸?shù)?Elasticsearch。這是一個(gè)流水線式的處理過程,數(shù)據(jù)在流動(dòng)過程中被消費(fèi)。
????????Redis 作為一個(gè)中間存儲(chǔ),當(dāng) Logstash 成功地從 Redis 中讀取數(shù)據(jù)并將其傳輸?shù)?Elasticsearch 時(shí),Logstash 會(huì)將這些數(shù)據(jù)從 Redis 中刪除。這是因?yàn)槟愕呐渲梦募惺褂昧?data_type => "list"
,這意味著當(dāng) Logstash 從 Redis 中獲取數(shù)據(jù)時(shí),它會(huì)使用類似于 LPOP
或 RPOP
的命令將數(shù)據(jù)從列表中彈出。這樣一來,Redis 中的數(shù)據(jù)會(huì)被不斷地消費(fèi),因此當(dāng)你使用 keys *
命令查詢時(shí)可能看不到數(shù)據(jù)。
????????如果你希望檢查 Redis 中是否有數(shù)據(jù)流入,你可以在 Filebeat 向 Redis 發(fā)送數(shù)據(jù)的同時(shí)進(jìn)行查詢。但是,請(qǐng)注意,當(dāng) Logstash 正在消費(fèi)數(shù)據(jù)時(shí),這些數(shù)據(jù)很可能會(huì)迅速從 Redis 中刪除。所以,你可能需要在 Filebeat 和 Logstash 之間調(diào)整數(shù)據(jù)發(fā)送速率,以便在 Redis 中查看數(shù)據(jù)。不過,這種做法并不是長(zhǎng)期監(jiān)控 Redis 數(shù)據(jù)的推薦方法,因?yàn)樗赡軙?huì)影響到整個(gè)流水線的性能。
2.5 配置 kibana
創(chuàng)建 kibana 索引:
三、消息隊(duì)列基本概述
3.1?什么是消息隊(duì)列
-
消息 Message:比如兩個(gè)設(shè)備進(jìn)行數(shù)據(jù)的傳輸,所傳輸?shù)娜魏螖?shù)據(jù),都可以稱為消息。
-
隊(duì)列 Queue: 是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),類似排隊(duì)買票機(jī)制。
而消息隊(duì)列 MQ:是用來保存消息的一個(gè)容器;消息隊(duì)列需要提供兩個(gè)功能接口供外部調(diào)用。
-
生產(chǎn)者 Producer:把數(shù)據(jù)放到消息隊(duì)列叫生產(chǎn)者。
-
消費(fèi)者 Consumer:從消息隊(duì)列里取數(shù)據(jù)叫做消費(fèi)者。
3.2?消息隊(duì)列的分類
MQ 主要分為兩類:點(diǎn)對(duì)點(diǎn)、發(fā)布/訂閱。
-
點(diǎn)對(duì)點(diǎn):消息隊(duì)列 Queue、發(fā)送者 sender、接收者 Receiver。
????????一個(gè)生產(chǎn)者生產(chǎn)的消息只能有一個(gè)消費(fèi)者,消息一旦被消費(fèi),消息就不在消息隊(duì)列中了。比如打電話,當(dāng)消息發(fā)送到消息隊(duì)列后只能被一個(gè)接收者接收,當(dāng)接收完畢消息則銷毀。
-
發(fā)布/訂閱:消息隊(duì)列 Queue、發(fā)布者 PubTisher、訂閱者 subscriber、主題 Topic。
????????每個(gè)消息可以有多個(gè)消費(fèi)者,彼此互不影響。比如我使用公眾號(hào)發(fā)布一篇文章,關(guān)注我的人都能看到,即發(fā)布到消息隊(duì)列的消息能被多個(gè)接收者(訂閱者)接收。
3.3?消息隊(duì)列使用場(chǎng)景
消息隊(duì)列最主要有三個(gè)場(chǎng)景,總結(jié)為 6 個(gè)字:解耦、異步、削峰。
3.3.1 解耦
場(chǎng)景說明:用戶下單后,訂單系統(tǒng)需要通知庫存系統(tǒng)。傳統(tǒng)的做法是,訂單系統(tǒng)調(diào)用庫存系統(tǒng)的接口。
傳統(tǒng)模式的缺點(diǎn):
-
假如庫存系統(tǒng)無法訪問,則訂單減庫存將失敗,從而導(dǎo)致訂單失敗;
-
訂單系統(tǒng)與庫存系統(tǒng)耦合。
中間件模式:
-
訂單系統(tǒng):用戶下單后,訂單系統(tǒng)完將消息寫入消息隊(duì)列,返回用戶訂單下單成功。
-
庫存系統(tǒng):訂閱下單的消息,獲取下單信息,庫存系統(tǒng)根據(jù)下單信息,進(jìn)行庫存操作。
-
假如:在下單時(shí)庫存系統(tǒng)不能正常使用。也不影響正常下單,因?yàn)橄聠魏?#xff0c;訂單系統(tǒng)寫入消息隊(duì)列就不再關(guān)心其他的后續(xù)操作了。實(shí)現(xiàn)訂單系統(tǒng)與庫存系統(tǒng)的應(yīng)用解耦。程序解耦?。
3.3.2 異步
場(chǎng)景說明:用戶注冊(cè)后,需要發(fā)注冊(cè)郵件和注冊(cè)短信。將注冊(cè)信息寫入數(shù)據(jù)庫成功后,發(fā)送注冊(cè)郵件,再發(fā)送注冊(cè)短信。以上三個(gè)任務(wù)全部完成后,返回給客戶端。
傳統(tǒng)模式的缺點(diǎn):系統(tǒng)的性能(并發(fā)量,吞吐量,響應(yīng)時(shí)間)會(huì)有瓶頸。
中間件模式:將不是必須的業(yè)務(wù)邏輯,異步處理。改造后的架構(gòu)如下:
????????按照以上約定,用戶的響應(yīng)時(shí)間相當(dāng)于是注冊(cè)信息寫入數(shù)據(jù)庫的時(shí)間,也就是 50 毫秒。注冊(cè)郵件,發(fā)送短信寫入消息隊(duì)列后,直接返回,因此寫入消息隊(duì)列的速度很快,基本可以忽略,因此用戶的響應(yīng)時(shí)間可能是 50ms 或?55ms。
3.3.3 削峰
場(chǎng)景說明:秒殺活動(dòng),一般會(huì)因?yàn)榱髁窟^大,導(dǎo)致流量暴增,應(yīng)用掛掉。
中間件模式:
-
用戶的請(qǐng)求,服務(wù)器接收后,首先寫入消息隊(duì)列。假如消息隊(duì)列長(zhǎng)度超過最大數(shù)量限制,則直接拋棄用戶請(qǐng)求或跳轉(zhuǎn)到錯(cuò)誤頁面。
-
秒殺業(yè)務(wù)可以根據(jù)自身能處理的能力獲取消息隊(duì)列數(shù)據(jù),然后做后續(xù)處理。這樣即使有 8000 個(gè)請(qǐng)求也不會(huì)造成秒殺業(yè)務(wù)奔潰。
四、Kafka 概述及集群部署
PS:我是在原來的 es-node1 和 es-node3 這兩天機(jī)器上安裝了 kafka、Zookeeper。
4.1 Kafka 集群安裝
可以查看我的這篇文章了解 kafka 及 kafka 集群的安裝與使用:【Kafka 3.x 初級(jí)】01、Kafka 概述及入門_Stars.Sky的博客-CSDN博客
4.2 Zookeeper 集群安裝?
可以查看我的這篇文章了解 Zookeeper 及 zookeeper 集群的安裝與使用:?
【Zookeeper 初級(jí)】02、Zookeeper 集群部署_Stars.Sky的博客-CSDN博客
五、Kafka-eagle 圖形界面安裝
官方安裝文檔:2.Install on Linux/macOS - Kafka Eagle (kafka-eagle.org)
Kafka-eagle 下載地址:Tags · smartloli/kafka-eagle-bin · GitHub
5.1 安裝 JDK?
可以查看我的這篇文章:Linux 部署 JDK+MySQL+Tomcat 詳細(xì)過程_移植mysql+tomcat_Stars.Sky的博客-CSDN博客
5.2 安裝 Kafka-eagle
[root@es-node2 ~]# tar -zxvf kafka-eagle-bin-3.0.2.tar.gz -C /usr/local/
[root@es-node2 ~]# cd /usr/local/kafka-eagle-bin-3.0.2/
[root@es-node2 /usr/local/kafka-eagle-bin-3.0.2]# tar -zxvf efak-web-3.0.2-bin.tar.gz [root@es-node2 ~]# vim /etc/profile
export KE_HOME=/usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2
export PATH=$KE_HOME/bin:$PATH
[root@es-node2 ~]# source /etc/profile
5.3 配置 Kafka-eagle
[root@es-node2 ~]# vim /usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2/conf/system-config.properties
######################################
# 填寫 zookeeper 集群環(huán)境信息,我們只有一套 zookeeper 集群,所以把 cluster2 注釋掉
efak.zk.cluster.alias=cluster1
cluster1.zk.list=es-node1:2181,es-node3:2181/kafka
#cluster2.zk.list=xdn10:2181,xdn11:2181,xdn12:2181######################################
# kafka sqlite jdbc driver address
######################################
# kafka sqlite 數(shù)據(jù)庫地址(需要修改存儲(chǔ)路徑)
efak.driver=org.sqlite.JDBC
efak.url=jdbc:sqlite:/usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2/db/ke.db
efak.username=root
efak.password=www.kafka-eagle.org######################################
# kafka mysql jdbc driver address
######################################
# mysql 數(shù)據(jù)庫地址(需要提前創(chuàng)建好 ke 庫,咱不是有 mysql 的存儲(chǔ)方式,所以這段內(nèi)容注釋掉)
#efak.driver=com.mysql.cj.jdbc.Driver
#efak.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
#efak.username=root
#efak.password=123456
5.4 啟動(dòng)?Kafka-eagle
[root@es-node2 ~]# /usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2/bin/ke.sh start
5.5 開啟 eagle 監(jiān)控
????????通過 JMX 獲取數(shù)據(jù),監(jiān)控 Kafka 客戶端、生產(chǎn)端、消息數(shù)、請(qǐng)求數(shù)、處理時(shí)間等數(shù)據(jù)可視化的性能。
# 開啟 Kafka 的 JMX(所有 Kafka 集群節(jié)點(diǎn)都需要)
[root@es-node1 /opt/kafka]# vim /opt/kafka/bin/kafka-server-start.sh
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; thenexport KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"export JMX_PORT="9999"
fi# 重啟 Kafka
[root@es-node1 /opt/kafka]# kf.sh stop
[root@es-node1 /opt/kafka]# kf.sh start
5.6 訪問 Kafka-eagle
http://192.168.170.133:8048
點(diǎn)擊 右邊列表的 TV Dashboard:?
5.7 遇到的小坑?
如果 eagle 儀表盤上監(jiān)控不到任何信息,則查看 eagle 錯(cuò)誤日志:
[root@es-node2 ~]# cd /usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2/logs/
[root@es-node2 /usr/local/kafka-eagle-bin-3.0.2/efak-web-3.0.2/logs]# tail -f error.log
[2023-04-11 15:17:00] KafkaServiceImpl.Thread-351 - ERROR - Get kafka consumer has error,msg is Failed create new KafkaAdminClient[2023-04-11 15:17:00] MetricsSubTask.Thread-351 - ERROR - Collector consumer topic data has error, msg is java.lang.NullPointerExceptionat org.smartloli.kafka.eagle.core.factory.KafkaServiceImpl.getKafkaConsumer(KafkaServiceImpl.java:749)at org.smartloli.kafka.eagle.web.quartz.MetricsSubTask.bscreenConsumerTopicStats(MetricsSubTask.java:113)at org.smartloli.kafka.eagle.web.quartz.MetricsSubTask.metricsConsumerTopicQuartz(MetricsSubTask.java:73)at org.smartloli.kafka.eagle.web.quartz.MetricsSubTask.run(MetricsSubTask.java:68)
解決辦法: 確保你自己 kafka 配置文件的?zookeeper.connect=192.168.170.132:2181,192.168.170.134:2181/kafka 與 eagle 配置文件中的?cluster1.zk.list=192.168.170.132:2181,192.168.170.134:2181/kafka 保持一致,再重新啟動(dòng) eagle 即可。
六、ELK 對(duì)接 Kafka
6.1 配置 Filebeat?
[root@es-node3 ~]# vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log # 收集日志的類型enabled: true # 啟用日志收集paths:- /var/log/nginx/access.log # 日志所在路徑tags: ["access"]- type: log # 收集日志的類型enabled: true # 啟用日志收集paths:- /var/log/nginx/error.log # 日志所在路徑tags: ["error"]output.kafka:hosts: ["192.168.170.132:9092", "192.168.170.134:9092"]topic: nginx_kafka_prodrequired_acks: 1 # 保證消息可靠,0不保證,1等待寫入主分區(qū)(默認(rèn)),-1等待寫入副本分區(qū)compression: gzip # 壓縮max_message_bytes: 10000 # 每條消息最大的長(zhǎng)度,多余的被刪除[root@es-node3 ~]# systemctl restart filebeat.service
6.2 配置 Logstash
[root@es-node1 ~]# vim /etc/logstash/conf.d/test6.conf
input {kafka {bootstrap_servers => "192.168.170.132:9092,192.168.170.134:9092"topics => ["nginx_kafka_prod"] # topic 名稱group_id => "logstash" # 消費(fèi)者組名稱client_id => "node1" # 消費(fèi)者組實(shí)例名稱consumer_threads => "2" # 理想情況下,您應(yīng)該擁有與分區(qū)數(shù)一樣多的線程,以實(shí)現(xiàn)完美的平衡,線程多于分區(qū)意味著某些線程將處于空閑狀態(tài)#topics_pattern => "app_prod*" # 通過正則表達(dá)式匹配要訂閱的主題codec => "json"}
}filter {if "access" in [tags][0] {grok {match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:hostname} (?:%{QS:referrer}|-) (?:%{NOTSPACE:post_args}|-) %{QS:useragent} (?:%{QS:x_forward_for}|-) (?:%{URIHOST:upstream_host}|-) (?:%{NUMBER:upstream_response_code}|-) (?:%{NUMBER:upstream_response_time}|-) (?:%{NUMBER:response_time}|-)" }}useragent {source => "useragent"target => "useragent"}geoip {source => "clientip"}date {match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"timezone => "Asia/Shanghai"}mutate {convert => ["bytes","integer"]convert => ["response_time", "float"]convert => ["upstream_response_time", "float"]remove_field => ["message", "agent", "tags"]add_field => { "target_index" => "kafka-logstash-nginx-access-%{+YYYY.MM.dd}" } }# 提取 referrer 具體的域名 /^"http/if [referrer] =~ /^"http/ {grok {match => { "referrer" => '%{URIPROTO}://%{URIHOST:referrer_host}' }}}# 提取用戶請(qǐng)求資源類型以及資源 ID 編號(hào)if "sky.com" in [referrer_host] {grok {match => { "referrer" => '%{URIPROTO}://%{URIHOST}/(%{NOTSPACE:sky_type}/%{NOTSPACE:sky_res_id})?"' }}}}else if "error" in [tags][0] {date {match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"timezone => "Asia/Shanghai"}mutate {add_field => { "target_index" => "kafka-logstash-nginx-error-%{+YYYY.MM.dd}" }}}
}output {stdout {codec => rubydebug}elasticsearch {hosts => ["192.168.170.132:9200","192.168.170.133:9200","192.168.170.134:9200"]index => "%{[target_index]}"template_overwrite => true}
}
6.3 配置 kibana
創(chuàng)建 Kibana 索引:
上一篇文章:【Elastic (ELK) Stack 實(shí)戰(zhàn)教程】09、Kibana 分析站點(diǎn)業(yè)務(wù)日志_Stars.Sky的博客-CSDN博客
下一篇文章:【Elastic (ELK) Stack 實(shí)戰(zhàn)教程】11、使用 ElastAlert 實(shí)現(xiàn) ES 釘釘群日志告警_Stars.Sky的博客-CSDN博客