1。1 背景
一般我們需要進行日誌分析場景直接在日誌檔案中 grep、awk 就可以獲得自己想要的資訊。但在規模較大的場景中,此方法效率低下,面臨的問題包括日誌量太大如何歸檔、文字搜尋太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有伺服器上的日誌收集彙總。常見的解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。
一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。
一個完整的集中式日誌系統,需要包含以下幾個主要特點:
收集-能夠採集多種來源的日誌資料
傳輸-能夠穩定地把日誌資料傳輸到中央系統
儲存-如何儲存日誌資料
分析-可以支援 UI 分析
警告-能夠提供錯誤的報告,監控機制
1。2 結構圖
此架構由Logstash分佈於各個節點上搜集相關日誌、資料,並經過分析、過濾後傳送給遠端伺服器上的Elasticsearch進行儲存。Elasticsearch將資料以分片的形式壓縮儲存並提供多種API供使用者查詢,操作。使用者亦可以更直觀的透過配置Kibana Web方便的對日誌查詢,並根據資料生成報表。
1。3 環境搭建
1。3。1目錄結構
1。3。2基於docker-compose搭建ELK
Docker-compose。yml配置
version: ‘3。7’
services:
elasticsearch:
image: elasticsearch:7。6。2
container_name: elasticsearch
privileged: true
user: root
environment:
#設定叢集名稱為elasticsearch
- cluster。name=elasticsearch
#以單一節點模式啟動
- discovery。type=single-node
#設定使用jvm記憶體大小
- ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- /opt/docker_elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /opt/docker_elk/elasticsearch/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
logstash:
image: logstash:7。6。2
container_name: logstash
ports:
- 4560:4560
privileged: true
environment:
- TZ=Asia/Shanghai
volumes:
#掛載logstash的配置檔案
- /opt/docker_elk/logstash/logstash。conf:/usr/share/logstash/pipeline/logstash。conf
- /opt/docker_elk/logstash/logstash。yml:/usr/share/logstash/config/logstash。yml
depends_on:
- elasticsearch
links:
#可以用es這個域名訪問elasticsearch服務
- elasticsearch:es
kibana:
image: kibana:7。6。2
container_name: kibana
ports:
- 5601:5601
privileged: true
links:
#可以用es這個域名訪問elasticsearch服務
- elasticsearch:es
depends_on:
- elasticsearch
environment:
#設定訪問elasticsearch的地址
- elasticsearch。hosts=http://es:9200
Logstash。conf配置
# ample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline。
#
#
input {
tcp {
mode => “server”
host => “0。0。0。0”
port => 4560
codec => json_lines
}
kafka {
bootstrap_servers => “” #這裡可以是kafka叢集,如“192。168。149。101:9092,192。168。149。102:9092,192。168。149。103:9092”
group_id => “host_log”
client_id => “logstash1” #注意,多臺logstash例項消費同一個topics時,client_id需要指定不同的名字
auto_offset_reset => “latest”
topics => [“test_kafka”]
add_field => {“logs_type” => “host”}
codec => json { charset => “UTF-8” }
}
}
output {
elasticsearch {
hosts => “150。158。50。66:9200”
index => “logstash-%{+YYYY。MM。dd}”
}
stdout { codec => rubydebug }
}
Logstash。conf配置檔案有三部分組成,input、fliter、output;
Input:接收資料來源資料型別有tcp、kafka、redis、mysql、filebeat等等
Filter:做資料過濾
Output:透過過濾後的資料推送到Elasticsearch中
docker-compose指令碼操作:
啟動:Docker-compose up –d # -d 後臺操作
停止:docker-compose down
1。4 報文推送kafka
資料推送有微服務端啟動,並並設定指定的埋點資料推送到kafka中,並由logstash消費。
第一步:微服務推送資料到kafka
第二步:logstash消費kafka資料
1。5 Kibana客戶端
透過Kibana可以訪問到ES的資料
kibana訪問連線:
http://${ip}:${port:5601}
資料查詢可以透過Discover或者Dev Tool
Discover頁面
或者
Dev Tool頁面
附錄
https://www。cnblogs。com/niechen/p/10149962。html