【分散式應用】ELK企業級日誌分析系統
一、ELK 簡介
ELK平臺是一套完整的日誌集中處理解決方案,將 ElasticSearch、Logstash 和 Kiabana 三個開源工具配合使用, 完成更強大的使用者對日誌的查詢、排序、統計需求。
簡述
預設情況下,ES叢集節點都是混合節點,即在elasticsearch.yml中預設node.master: true和node.data: true。
當ES叢集規模達到一定程度以後,就需要注意對叢集節點進行角色劃分。
ES叢集節點可以劃分為三種:主節點、資料節點和客戶端節點。
這是一種分而治之的思想,也是一種術業專攻的體現。
三類節點說明
master - 主節點:
elasticsearch.yml :
node.master: true node.data: false
主要功能:維護元資料,管理叢集節點狀態;不負責資料寫入和查詢。
配置要點:記憶體可以相對小一些,但是機器一定要穩定,最好是獨佔的機器。
data - 資料節點:
elasticsearch.yml :
node.master: false node.data: true
主要功能:負責資料的寫入與查詢,壓力大。
配置要點:大記憶體,最好是獨佔的機器。
client - 客戶端節點:
elasticsearch.yml :
node.master: false node.data: false
主要功能:負責任務分發和結果匯聚,分擔資料節點壓力。
配置要點:大記憶體,最好是獨佔的機器
mixed- 混合節點(不建議):
elasticsearch.yml :
node.master: true node.data: true
主要功能:綜合上述三個節點的功能。
配置要點:大記憶體,最好是獨佔的機器。
特別說明:不建議這種配置,節點容易掛掉。
1.1 ELK各元件介紹
ElasticSearch:
- 是基於Lucene(一個全文檢索引擎的架構)開發的分散式儲存檢索引擎,用來儲存各類日誌。
- Elasticsearch 是用 Java 開發的,可通過 RESTful Web 介面,讓使用者可以通過瀏覽器與Elasticsearch 通訊。
- Elasticsearch是一個實時的、分散式的可擴充套件的搜尋引擎,允許進行全文、結構化搜尋,它通常用於索引和搜尋大容量的日誌資料,也可用於搜尋許多不同型別的文件。
Kiabana:
- Kibana 通常與 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一個功能強大的資料視覺化 Dashboard,Kibana 提供圖形化的 web 介面來瀏覽 Elasticsearch 日誌資料,可以用來彙總、分析和搜尋重要資料。
Logstash:
- 作為資料收集引擎。它支援動態的從各種資料來源蒐集資料,並對資料進行過濾、分析、豐富、統一格式等操作,然後儲存到使用者指定的位置,一般會發送給 Elasticsearch。
- Logstash 由 Ruby 語言編寫,執行在 Java 虛擬機器(JVM)上,是一款強大的資料處理工具, 可以實現資料傳輸、格式處理、格式化輸出。Logstash 具有強大的外掛功能,常用於日誌處理。
過濾模組是logstash的核心功能。
1.2 可以新增的其它元件:
Filebeat:
- 輕量級的開源日誌檔案資料蒐集器。通常在需要採集資料的客戶端安裝 Filebeat,並指定目錄與日誌格式,Filebeat 就能快速收集資料,併發送給 logstash 進行解析,或是直接發給 Elasticsearch 儲存,效能上相比運行於 JVM 上的 logstash 優勢明顯,是對它的替代。常應用於 EFLK 架構當中。(如果要使用過濾功能的話,Filebeat不能完全替代logstash,Filebeat沒有過濾功能,收集資料後需要傳送給 logstash 進行處理)
filebeat 結合 logstash 帶來好處:
- 通過 Logstash 具有基於磁碟的自適應緩衝系統,該系統將吸收傳入的吞吐量,從而減輕 Elasticsearch 持續寫入資料的壓力。
- 從其他資料來源(例如資料庫,S3物件儲存或訊息傳遞佇列)中提取。
- 將資料傳送到多個目的地,例如S3,HDFS(Hadoop分散式檔案系統)或寫入檔案。
- 使用條件資料流邏輯組成更復雜的處理管道。
快取/訊息佇列(redis、kafka、RabbitMQ等):
- 可以對高併發日誌資料進行流量削峰和緩衝,這樣的緩衝可以一定程度的保護資料不丟失,還可以對整個架構進行應用解耦。
Fluentd:
- 是一個流行的開源資料收集器。由於 logstash 太重量級的缺點,Logstash 效能低、資源消耗比較多等問題,隨後就有 Fluentd 的出現。相比較 logstash,Fluentd 更易用、資源消耗更少、效能更高,在資料處理上更高效可靠,受到企業歡迎,成為 logstash 的一種替代方案,常應用於 EFK 架構當中。在 Kubernetes 叢集中也常使用 EFK 作為日誌資料收集的方案。
- 在 Kubernetes 叢集中一般是通過 DaemonSet 來執行 Fluentd,以便它在每個 Kubernetes 工作節點上都可以執行一個 Pod。 它通過獲取容器日誌檔案、過濾和轉換日誌資料,然後將資料傳遞到 Elasticsearch 叢集,在該叢集中對其進行索引和儲存。
1.3 ELK、ELFK、EFLKL
ELK: ES+logstash+kibana
ELFK: ES+logstash+filebeat+kibana
ELFK: ES+filebeat+logstash+kafka+kibana
二、為什麼要使用 ELK
日誌主要包括系統日誌、應用程式日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解伺服器軟硬體資訊、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解伺服器的負荷,效能安全性,從而及時採取措施糾正錯誤。
往往單臺機器的日誌我們使用grep、awk等工具就能基本實現簡單分析,但是當日志被分散的儲存不同的裝置上。如果你管理數十上百臺伺服器,你還在使用依次登入每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有伺服器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成為一件比較麻煩的事情,一般我們使用 grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。
三、完整日誌系統基本特徵
收集: 能夠採集多種來源的日誌資料。
傳輸: 能夠穩定的把日誌資料解析過濾並傳輸到儲存系統。
儲存: 儲存日誌資料。
分析: 支援 UI 分析。
警告: 能夠提供錯誤報告,監控機制。
四、ELK 的工作原理
(1)在所有需要收集日誌的伺服器上部署Logstash;或者先將日誌進行集中化管理在日誌伺服器上,在日誌伺服器上部署 Logstash。
(2)Logstash 收集日誌,將日誌格式化並輸出到 Elasticsearch 群集中。
(3)Elasticsearch 對格式化後的資料進行索引和儲存。
(4)Kibana 從 ES 群集中查詢資料生成圖表,並進行前端資料的展示。
總結:logstash作為日誌蒐集器,從資料來源採集資料,並對資料進行過濾,格式化處理,然後交由Elasticsearch儲存,kibana對日誌進行視覺化處理。
五、ELK叢集部署
實驗環境:
伺服器型別 | 系統和IP地址 | 需要安裝的元件 | 硬體方面 |
node01節點 | CentOS7.4(64 位)192.168.68.110 | Elasticsearch 、Kibana | 2核4G |
node02節點 | CentOS7.4(64 位)192.168.68.111 | Elasticsearch | 2核4G |
Apache節點 | CentOS7.4(64 位)192.168.68.113 | Elasticsearch 、Apache | 2核4G |
實驗步驟:
初始化環境,關閉所有節點的防火牆
systemctl stop firewalld setenforce 0
5.1 Elasticsearch部署(在Node1、Node2節點上操作)
1、環境準備,設定Java環境
#設定Java環境 java -version #如果沒有安裝,yum -y install java openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-b12) OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
2、部署 Elasticsearch 軟體
#安裝elasticsearch—rpm包,上傳elasticsearch-5.5.0.rpm到/opt目錄下 cd /opt rpm -ivh elasticsearch-5.5.0.rpm
3、修改主機名,在/etc/hosts檔案中新增對映關係
#node01節點 hostnamectl set-hostname node01 su vim /etc/hosts 192.168.121.10 node01 192.168.121.20 node02 #node02節點 hostnamectl set-hostname node02 su vim /etc/hosts 192.168.68.110 node01 192.168.68.111 node02
1.環境準備
4、修改 Elasticsearch主配置檔案
#修改主配置檔案前先備份 cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak #修改主配置檔案 vim /etc/elasticsearch/elasticsearch.yml --17--取消註釋,指定叢集名字 cluster.name: my-elk-cluster --23--取消註釋,指定節點名字:Node1節點為node1,Node2節點為node2 node.name: node1 node.master: true #是否master節點,false為否 node.data: true #是否資料節點,false為否 --33--取消註釋,指定資料存放路徑 path.data: /var/lib/elasticsearch --37--取消註釋,指定日誌存放路徑 path.logs: /var/log/elasticsearch --43--取消註釋,避免es使用swap交換分割槽 bootstrap.memory_lock: true --55--取消註釋,設定監聽地址,0.0.0.0代表所有地址 network.host: 0.0.0.0 --59--取消註釋,ES 服務的預設監聽埠為9200 http.port: 9200 #指定es叢集提供外部訪問的介面 transport.tcp.port: 9300 #指定es叢集內部通訊介面 --68--取消註釋,叢集發現通過單播實現,指定要發現的節點 discovery.zen.ping.unicast.hosts: ["192.168.121.40:9300", "192.168.121.50:9300"] grep -v "^#" /etc/elasticsearch/elasticsearch.yml
5、ES 效能調優引數
#(1)優化最大記憶體大小和最大檔案描述符的數量 vim /etc/security/limits.conf ...... * soft nofile 65536 * hard nofile 131072 * soft memlock unlimited * hard memlock unlimited #不鎖記憶體,即不限制記憶體(一半給ES,一半給作業系統) #需重啟生效 #臨時生效可以通過"ulimit -n 數量"命令來修改每個程序可開啟的最大檔案數 #(2)優化elasticsearch使用者擁有的記憶體許可權 vim /etc/sysctl.conf #一個程序可以擁有的最大記憶體對映區域數,參考資料(分配 2g/262144,4g/4194304,8g/8388608) vm.max_map_count=262144 #一個程序能夠分配的最大記憶體大小 sysctl -p sysctl -a | grep vm.max_map_count
優化elasticsearch使用者擁有的記憶體許可權:
由於ES構建基於lucene, 而lucene設計強大之處在於lucene能夠很好的利用作業系統記憶體來快取索引資料,以提供快速的查詢效能。lucene的索引檔案segements是儲存在單檔案中的,並且不可變,對於OS來說,能夠很友好地將索引檔案保持在cache中,以便快速訪問;因此,我們很有必要將一半的實體記憶體留給lucene ; 另一半的實體記憶體留給ES(JVM heap )。所以, 在ES記憶體設定方面,可以遵循以下原則:
- 當機器記憶體小於64G時,遵循通用的原則,50%給ES,50%留給作業系統,供lucene使用。
- 當機器記憶體大於64G時,遵循原則:建議分配給ES分配 4~32G 的記憶體即可,其它記憶體留給作業系統,供lucene使用。
6、啟動elasticsearch是否成功開啟
systemctl start elasticsearch.service systemctl enable elasticsearch.service netstat -antp | grep 9200
7、檢視節點資訊
瀏覽器訪問 http://192.168.68.110:9200 http://192.168.68.111:9200 檢視節點 Node1、Node2 的資訊。 瀏覽器訪問 http://192.168.68.110:9200/_cluster/health?pretty http://192.168.68.111:9200/_cluster/health?pretty 檢視群集的健康情況,可以看到 status 值為 green(綠色), 表示節點健康執行。 瀏覽器訪問 http://192.168.121.10:9200/_cluster/state?pretty 檢查群集狀態資訊。
8、安裝 Elasticsearch-head 外掛
使用上述方式檢視群集的狀態對使用者並不友好,可以通過安裝 Elasticsearch-head 外掛,可以更方便地管理群集。
Elasticsearch 在 5.0 版本後,Elasticsearch-head 外掛需要作為獨立服務進行安裝,需要使用npm工具(NodeJS的包管理工具)安裝。
- 安裝 Elasticsearch-head 需要提前安裝好依賴軟體 node 和 phantomjs。
- node:是一個基於 Chrome V8 引擎的 JavaScript 執行環境。
- phantomjs:是一個基於 webkit 的JavaScriptAPI,可以理解為一個隱形的瀏覽器,任何基於 webkit 瀏覽器做的事情,它都可以做到。
(1)編譯安裝 node #上傳軟體包 node-v8.2.1.tar.gz 到/opt yum install gcc gcc-c++ make -y cd /opt tar zxvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure make && make install (2)安裝 phantomjs #上傳軟體包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到 cd /opt tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/ cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin cp phantomjs /usr/local/bin (3)安裝 Elasticsearch-head 資料視覺化工具 #上傳軟體包 elasticsearch-head.tar.gz 到/opt cd /opt tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/ cd /usr/local/src/elasticsearch-head/ npm install (4)修改 Elasticsearch 主配置檔案 vim /etc/elasticsearch/elasticsearch.yml ...... --末尾新增以下內容-- http.cors.enabled: true #開啟跨域訪問支援,預設為 false http.cors.allow-origin: "*" #指定跨域訪問允許的域名地址為所有 systemctl restart elasticsearch (5)啟動 elasticsearch-head 服務 #必須在解壓後的 elasticsearch-head 目錄下啟動服務,程序會讀取該目錄下的 gruntfile.js 檔案,否則可能啟動失敗。 cd /usr/local/src/elasticsearch-head/ npm run start & > elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head > grunt server Running "connect:server" (connect) task Waiting forever... Started connect web server on http://localhost:9100 #elasticsearch-head 監聽的埠是 9100 netstat -natp |grep 9100 (6)通過 Elasticsearch-head 檢視 Elasticsearch 資訊 通過瀏覽器訪問 http://192.168.121.10:9100/ 地址並連線群集。如果看到群集健康值為 green 綠色,代表群集很健康。 (7)插入索引 #通過命令插入一個測試索引,索引為 index-demo,型別為 test。 curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}' //輸出結果如下: { "_index" : "index-demo", "_type" : "test", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "created" : true } 瀏覽器訪問 http://192.168.68.110:9100/ 檢視索引資訊,可以看見索引預設被分片5個,並且有一個副本。 點選“資料瀏覽”,會發現在node1上建立的索引為 index-demo,型別為 test 的相關資訊。
5.2 Logstash 部署(在 Apache 節點上操作)
Logstash 一般部署在需要監控其日誌的伺服器。在本案例中,Logstash 部署在 Apache 伺服器上,用於收集 Apache 伺服器的日誌資訊併發送到 Elasticsearch。
1、更改主機名
hostnamectl set-hostname apache
2、安裝Apahce服務(httpd)
yum -y install httpd
systemctl start httpd
3、安裝Java環境
yum -y install java
java -version
4、安裝logstash
#上傳軟體包 logstash-5.5.1.rpm 到/opt目錄下 cd /opt rpm -ivh logstash-5.5.1.rpm systemctl start logstash.service systemctl enable logstash.service #將logstash放入PATH環境變數的目錄中,便於系統識別 ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
5、測試 Logstash
(1)Logstash 命令常用選項:
(2)定義輸入和輸出流:
#1.輸入採用標準輸入,輸出採用標準輸出(類似管道) logstash -e 'input { stdin{} } output { stdout{} }' ...... www.baidu.com #鍵入內容(標準輸入) 2020-12-22T03:58:47.799Z node1 www.baidu.com #輸出結果(標準輸出) www.sina.com.cn #鍵入內容(標準輸入) 2017-12-22T03:59:02.908Z node1 www.sina.com.cn #輸出結果(標準輸出) //執行 ctrl+c 退出 #2.使用 rubydebug 輸出詳細格式顯示,codec 為一種編解碼器 logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }' ...... www.baidu.com #鍵入內容(標準輸入) { "@timestamp" => 2020-12-22T02:15:39.136Z, #輸出結果(處理後的結果) "@version" => "1", "host" => "apache", "message" => "www.baidu.com" } #3.使用 Logstash 將資訊寫入 Elasticsearch 中 logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.80.10:9200"] } }' 輸入 輸出 對接 ...... www.baidu.com #鍵入內容(標準輸入) www.sina.com.cn #鍵入內容(標準輸入) www.google.com #鍵入內容(標準輸入) //結果不在標準輸出顯示,而是傳送至 Elasticsearch 中,可瀏覽器訪問 http://192.168.68.110:9100/ 檢視索引資訊和資料瀏覽。
6、定義 logstash配置檔案
Logstash 配置檔案基本由三部分組成:input、output 以及 filter(可選,根據需要選擇使用)。
- input:表示從資料來源採集資料,常見的資料來源如Kafka、日誌檔案等。
- filter:表示資料處理層,包括對資料進行格式化處理、資料型別轉換、資料過濾等,支援正則表示式。
- output:表示將Logstash收集的資料經由過濾器處理之後輸出到Elasticsearch。
#格式如下: input {...} filter {...} output {...} #在每個部分中,也可以指定多個訪問方式。例如,若要指定兩個日誌來原始檔,則格式如下: input { file { path =>"/var/log/messages" type =>"syslog"} file { path =>"/var/log/httpd/access.log" type =>"apache"} }
修改Logstash 配置檔案:
#修改 Logstash 配置檔案,讓其收集系統日誌/var/log/messages,並將其輸出到 elasticsearch 中。 chmod +r /var/log/messages #讓 Logstash 可以讀取日誌 vim /etc/logstash/conf.d/system.conf input { file{ path =>"/var/log/messages" #指定要收集的日誌的位置 type =>"system" #自定義日誌型別標識 start_position =>"beginning" #表示從開始處收集 } } output { elasticsearch { #輸出到 elasticsearch hosts => ["192.168.68.110:9200","192.168.68.111:9200"] #指定 elasticsearch 伺服器的地址和埠 index =>"system-%{+YYYY.MM.dd}" #指定輸出到 elasticsearch 的索引格式 } } systemctl restart logstash 瀏覽器訪問 http://192.168.68.110:9100/ 檢視索引資訊
5.3 Kiabana 部署(在 Node1 節點上操作)
1、安裝 Kiabana
#上傳軟體包 kibana-5.5.1-x86_64.rpm 到/opt目錄 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 複製程式碼
2、設定 Kibana 的主配置檔案
vim /etc/kibana/kibana.yml #--第2行--取消註釋,Kiabana 服務的預設監聽埠為5601 server.port: 5601 #--第7行--取消註釋,設定 Kiabana 的監聽地址,0.0.0.0代表所有地址 server.host: "0.0.0.0" #--第28行--取消註釋,配置es伺服器的ip,如果是叢集則配置該叢集中master節點的ip elasticsearch.url: ["http://192.168.68.110:9200","http://192.168.68.111:9200"] #--第37行--取消註釋,設定在 elasticsearch 中新增.kibana索引 kibana.index: ".kibana" #--第96行--取消註釋,配置kibana的日誌檔案路徑(需手動建立),不然預設是messages裡記錄日誌 logging.dest: /var/log/kibana.log
3、建立日誌檔案,啟動 Kibana 服務
touch /var/log/kibana.log chown kibana:kibana /var/log/kibana.log systemctl start kibana.service systemctl enable kibana.service netstat -natp | grep 5601
4、驗證 Kibana
瀏覽器訪問 http://192.168.68.110:5601 第一次登入需要新增一個 Elasticsearch 索引: Index name or pattern //輸入:system-* #在索引名中輸入之前配置的 Output 字首“system” 單擊 “create” 按鈕建立,單擊 “Discover” 按鈕可檢視圖表資訊及日誌資訊。 資料展示可以分類顯示,在“Available Fields”中的“host”,然後單擊 “add”按鈕,可以看到按照“host”篩選後的結果
5、將 Apache 伺服器的日誌(訪問的、錯誤的)新增到 Elasticsearch 並通過 Kibana 顯示
vim /etc/logstash/conf.d/apache_log.conf input { file{ path => "/etc/httpd/logs/access_log" #指定訪問日誌存放位置錄 type => "access" start_position => "beginning" #beginning表示從開頭收集,如果只需收集最新的,此處改為latest } file{ path => "/etc/httpd/logs/error_log" #指定錯誤日誌存放位置 type => "error" start_position => "beginning" } } output { if [type] == "access" { elasticsearch { hosts => ["192.168.68.110:9200","192.168.68.111:9200"] index => "apache_access-%{+YYYY.MM.dd}" #索引字尾加上當天的日期 } } if [type] == "error" { elasticsearch { hosts => ["192.168.68.110:9200","192.168.68.111:9200"] index => "apache_error-%{+YYYY.MM.dd}" #索引字尾加上當天的日期 } } } cd /etc/logstash/conf.d/ /usr/share/logstash/bin/logstash -f apache_log.conf
ELFK叢集部署(Filebeat+ELK)
ELFK= ES + logstash+filebeat+kibana
實驗環境
注意:ELFK各安裝包的版本要一致,或相近。
實驗步驟:
1.1 部署ELK叢集
ELK叢集的部署在前一篇文章中有詳細介紹,可參考前一篇文章。
注意:ELFK叢集環境下,Logstash 元件所在節點的/etc/logstash/conf.d目錄下,不需要建立system.conf配置檔案,即Logstash不需要收集系統日誌,因為系統日誌將由filebeat收集後傳送給Logstash。(安裝filebeat後,Logstash會建立filebeat.conf配置檔案獲取filebeat傳來的資料)
1.2 安裝 Filebeat(在apache節點操作)
#上傳軟體包 filebeat-6.2.4-linux-x86_64.tar.gz 到/opt目錄 tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz mv filebeat-6.2.4-linux-x86_64/ /usr/local/filebeat
1.3 設定 filebeat 的主配置檔案
cd /usr/local/filebeat vim filebeat.yml filebeat.prospectors: - type: log #指定 log 型別,從日誌檔案中讀取訊息 enabled: true paths: - /var/log/messages #指定監控的日誌檔案 - /var/log/*.log tags: ["sys"] #設定索引標籤 fields: #可以使用 fields 配置選項設定一些引數欄位新增到 output 中 service_name: filebeat log_type: syslog from: 192.168.68.113 --------------Elasticsearch output------------------- (全部註釋掉) ----------------Logstash output--------------------- output.logstash: hosts: ["192.168.68.113:5044"] #指定 logstash 的 IP 和埠 #啟動 filebeat nohup ./filebeat -e -c filebeat.yml > filebeat.out & #-e:輸出到標準輸出,禁用syslog/檔案輸出 #-c:指定配置檔案 #nohup:在系統後臺不掛斷地執行命令,退出終端不會影響程式的執行
1.4 在 Logstash 元件所在節點上新建一個 Logstash 配置檔案
cd /etc/logstash/conf.d vim filebeat.conf input { beats { port => "5044" } } output { elasticsearch { hosts => ["192.168.68.110:9200","192.168.68.111:9200"] index => "%{[fields][service_name]}-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } } #啟動 logstash logstash -f filebeat.conf
5、瀏覽器訪問
瀏覽器訪問 http://192.168.68.110:5601 登入 Kibana, 單擊“Create Index Pattern”按鈕新增索引“filebeat-*”,單擊 “create” 按鈕建立,單擊 “Discover” 按鈕可檢視圖表資訊及日誌資訊。
二、Logstash的過濾模組
2.1 Logstash配置檔案中的模組
1、input {}
- 指定輸入流,通過file、beats、kafka、redis中獲取資料
2、filter {}
常用外掛:
- grok:對若干個大文字欄位進行再分割,分割成一些小欄位 (?<欄位名>正則表示式) 欄位名:正則表示匹配到的內容
- date:對資料中的時間進行統一格式化
- mutate:對一些無用的欄位進行剔除,或增加欄位
- mutiline:對多行資料進行統一編排,多行合併和拆分
3、ourput {}
- elasticsearch stdout
2.2 Filter(過濾模組)中的外掛
而對於 Logstash 的 Filter,這個才是 Logstash 最強大的地方。Filter 外掛也非常多,我們常用到的 grok、date、mutate、mutiline 四個外掛。
grok外掛(通過grok外掛實現對欄位的分割,使用萬用字元)
這裡就要用到 logstash 的 filter 中的 grok 外掛。filebeat 傳送給 logstash 的日誌內容會放到message 欄位裡面,logstash 匹配這個 message 欄位就可以了。
格式:
匹配格式:(?<欄位名>正則表示式)
# 欄位名:正則表示式匹配到的內容
例項1:
(?<remote_addr>%{IPV6}|%{IPV4} )(?<other_info>.+)
#對資料進行分割ip欄位名為remote_addr, 其他欄位名為other_info
例項2:
(?<remote_addr>%{IPV6}|%{IPV4} )[\s-]+[(?<log_time>.+)](?<other_info>.+)
#新增匹配時間欄位
例項3:
#分割多個欄位 (?<remote_addr>%{IPV6}|%{IPV4})[\s-]+[(?<log_time>.+)]\s+"(?<http_method>\S+)\s+(?<url-path>.+)"\s+(?<rev_code>\d+)(?<other_info>.+)
例項4:
cd /etc/logstash/conf.d/ cp filebeat.conf filter.conf vim filter.conf input { beats { port => "5044" } } filter { grok { match =>["message","(?<remote_addr>%{IPV6}|%{IPV4} )[\s-]+[(?<log_time>.+)]\s+"(?<http_method>\S+)\s+(?<url-path>.+)"\s+(?<rev_code>\d+)(?<other_info>.+)"] } } output { elasticsearch { hosts => ["192.168.121.10:9200","192.168.121.20:9200"] index => "{[filter][service_name]}-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } } logstash -f filter.conf #啟動
總結
1)ELK三大元件及其工作流程
元件:ElasticSearch(簡稱:ES)、Logstash和Kiabana
流程:
Logstash負責資料的收集,對資料進行過濾、分析等操作,然後儲存到指定的位置,傳送給ES;
ES是分散式儲存檢索引擎,用來儲存各類日誌,可以讓使用者可以通過瀏覽器與 ES通訊;
Kiabana為 Logstash 和 ES 提供圖形化的日誌分析 Web 介面展示,可以彙總、分析和搜尋重要資料日誌。
2)生產中一般用什麼來代替logstash?為什麼?
一般使用Filebeat代替logstash
因為logstash是由Java開發的,需要執行在JVM上,耗資源較大,執行佔用CPU和記憶體高。另外沒有訊息佇列快取,存在資料丟失隱患;而filebeat是一款輕量級的開源日誌檔案資料蒐集器,能快速收集資料,併發送給 logstash 進行解析,效能上相比運行於 JVM 上的 logstash 優勢明顯。
3)ELK叢集配置的步驟是什麼
1)一般至少需要三臺主機
2)設定各主機的主機名和IP的對映,修改ES主配置檔案
3)通過修改discovery.zen.ping項,通過單播實現叢集,指定要發現的節點