ELK日志分析系統搭建
之前一段時間由於版本迭代任務緊,組內代碼質量不盡如人意。接二連三的被測試提醒后台錯誤之后, 我們決定搭建一個后台日志分析系統, 經過幾個方案比較后,選擇的相對更簡單的ELK方案。
ELK 是Elasticsearch, Logstash,Kibana三個組件的首字母組合,這種方案最初的做法是:使用Logstash 去服務上采集日志文件, 然后做一些過濾處理后發送給 Elasticsearch, 在Elasticsearch中創建相應的索引,由Kibana提供統計分析的頁面訪問。但是Logstash 本身資源消耗較大,如果把它放到業務系統的服務器上會對系統造成不小的影響,一般的做法采用beats來替代(beats是一個更輕量級的收集器),參考如下圖-1,此外也會有在數據量比較大時引入消息隊列來環節組件壓力。
詳細的關於各組件的介紹建議參考Elastic 提供的官方文檔
(圖-1)
(圖-2)
本文將基於上圖-2的架構來介紹ELK日志系統的搭建。由於環境限制,這里各組件均部署在同一服務器上。
1)搭建elasticsearch
elasticsearch的下載安裝配置在所有組件中相對是最復雜的,但是它依然可以很簡單的按照如下幾個步驟順利完成:
① 官網下載地址 :https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-linux-x86_64.tar.gz
② 解壓之后配置 elasticsearch-7.12.1/config/elasticsearch.yml 文件,如下
# ---------------------------------- Cluster ----------------------------------- # 指定集群名 cluster.name: customer-service # ------------------------------------ Node ------------------------------------ # 在集群名為customer-service 的集群下的 node-1 節點 node.name: node-1 # ---------------------------------- Network ----------------------------------- # 開啟本質之外的網絡訪問 network.host: 0.0.0.0 # --------------------------------- Discovery ---------------------------------- # 定義初始主機點 cluster.initial_master_nodes: ["node-1"]
③ 啟動elasticsearch (處於安全考慮 elasticsearch 只能非root用戶啟動,需要將elasticsearch解壓文件切換所屬用戶)
# 解壓路徑下
建議加入nohup & ./bin/elasticsearch
④ 驗證elasticsearch是否啟動成功
curl http://localhost:9200
如果看到如下結果,代表啟動成功
{ "name" : "node-1", "cluster_name" : "elasticsearch", "cluster_uuid" : "tYgc-2l3ThqcEfFKfeWgBQ", "version" : { "number" : "7.12.1", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "7a013de", "build_date" : "2021-05-23T14:04:00.380842Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
2)Kibana的安裝
① 官網下載:https://artifacts.elastic.co/downloads/kibana/kibana-7.12.1-linux-x86_64.tar.gz
② 配置解壓路徑下的/kibana-7.12.1-linux-x86_64/config/kibana.yml文件:
# 將server.host 改為所有IP, 這樣以便不同主機可以訪問到kibana頁面
server.host: 0.0.0.0
③ 瀏覽器訪問 http://ip:5601 (默認5601端口,可以在kibana.yml中配置) 得到如下頁面表示啟動成功
(圖-3)
3)Filebeat 的安裝
① 官方下載:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.12.1-linux-x86_64.tar.gz
② 配置解壓路徑下的配置文件 filebeat.yml 如下:
③ 啟動 filebeat
# 注意使用root用戶登錄, 准確的說是注意用戶對文件所擁有的權限
# -e 讓日志打印到控制台, -c 重新指定啟動的配置文件, -d 指定調試選擇者器
./filebeat -e -c filebeat.yml -d "publish"
4)Logstash 的安裝
① 官網下載:https://artifacts.elastic.co/downloads/logstash/logstash-7.12.1.tar.gz
② 配置logstash,增加customer-service-logstash.yml 的配置文件,文件配置內容如下:
# logstash 輸入配置,這里我們采用beat采集日志
input { beats { port => "5044" } }
# The filter part of this file is commented out to indicate that it is # optional. filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }
# 此外還可以添加其他過濾器插件 } output {
# 輸出到控制台打印 stdout { codec => rubydebug }
# 輸出到elasticsearch ,並指定索引名稱 elasticsearch { hosts => [ "127.0.0.1:9200" ] index => "logstash-customer-service-log" } }
如上是最簡單的配置沒有geoip如下是千測萬險嘔心瀝血寫的grok規則匹配
input {
beats {
port => 5044
filter {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
mutate {
remove_field =>["message"]
}
geoip {
##########備注這個庫是自動加載的,但有時候如果報錯可以加入試下database =>"/usr/local/logstash/config/GeoLite2-City.mmdb"
source => "clientip"
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => "127.0.0.1:9200"
index => "logstash-nginx-access-427-1"
}
#####如需要添加多個filebeat接收日志如下
if [fields][service] == 'wonima' {
elasticsearch {
hosts => "127.0.0.1:9200"
index => "logstash-nginx-access-wonima.com"
}
}
}
如圖所示是patterns 正則分割你日志的
③ 啟動logstash
# -f 從指定路徑獲取logstash啟動的yml配置文件
# --config.reload.automatic 監聽配置文件 如果有改動自動加載
bin/logstash -f first-pipeline.conf --config.reload.automatic
elk 報錯執行入下
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
所有上述組件配置啟動成功后,我們可以到kibana界面, 在側邊欄 management 下按下圖-4方式創建 索引模式后,然后在圖-5中可以獲取到實時的日志記錄。
(圖-4)
(圖-5)
我們在logstash中增加對error級別日志的過濾處理,將這些日志統一放到 logstash-customer-service-error 索引中,然后在 kibana 中創建該索引同名的pattern, 這樣在discover頁簽下可以直觀的通過 時間段的篩選來定位error日志,並在下面的 expanded document 下查看日志的具體內容,這樣一來就不需要挨個連接到服務器去手動查看日志了。
要想用geoip必須索引創建名為logstash開頭(這個是個大坑啊)
膽大!心細!