ELK 日誌收集系統

傳統系統日誌收集的問題

在傳統項目中,若是在生產環境中,有多臺不一樣的服務器集羣,若是生產環境須要經過日誌定位項目的Bug的話,須要在每臺節點上使用傳統的命令方式查詢,這樣效率很是底下。 前端

一般,日誌被分散在儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的syslog,將全部服務器上的日誌收集彙總。java

集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。node

查詢命令:mysql

tail -n 300 myes.log | grep 'node-1'web

tail -100f myes.log正則表達式

ELK分佈式日誌收集系統介紹

ElasticSearch 是一個基於Lucene的開源分佈式搜索服務器。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。redis

Logstash 是一個徹底開源的工具,它能夠對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供之後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展現全部日誌。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。 sql

Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展現工具,也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。數據庫

ELK分佈式日誌收集原理

一、每臺服務器集羣節點安裝Logstash日誌收集系統插件json

二、每臺服務器節點將日誌輸入到Logstash中

三、Logstash將該日誌格式化爲json格式,根據天天建立不一樣的索引,輸出到ElasticSearch中

四、瀏覽器使用安裝Kibana查詢日誌信息

環境安裝

一、安裝ElasticSearch

二、安裝Logstash

三、安裝Kibana

 

Logstash介紹

Logstash是一個徹底開源的工具,它能夠對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供之後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展現全部日誌。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。 核心流程:Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括全部能夠拋出來的日誌類型。

Logstash工做原理

Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括全部能夠拋出來的日誌類型。

 logstash:輸入(讀取本地文件或者鏈接數據庫)、輸出Json 格式。

Input:輸入數據到logstash,再由logstatsh輸出(Json格式)數據到es服務器上。

 

一些經常使用的輸入爲:
file:從文件系統的文件中讀取,相似於tail -f命令
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取

 

Filters:數據中間處理,對數據進行操做。

 

一些經常使用的過濾器爲:
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要做用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
clone:拷貝 event,這個過程當中也能夠添加或移除字段。
geoip:添加地理信息(爲前臺kibana圖形化展現使用)
Outputs:outputs是logstash處理管道的最末端組件。一個event能夠在處理過程當中通過多重輸出,可是一旦全部的outputs都執行結束,這個event也就完成生命週期。

 

一些常見的outputs爲:
elasticsearch:能夠高效的保存數據,而且可以方便和簡單的進行查詢。
file:將event數據保存到文件中。
graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展現的組件。
Codecs:codecs 是基於數據流的過濾器,它能夠做爲input,output的一部分配置。Codecs能夠幫助你輕鬆的分割發送過來已經被序列化的數據。

 

一些常見的codecs:
json:使用json格式對數據進行編碼/解碼。
multiline:將匯多個事件中數據彙總爲一個單一的行。好比:java異常信息和堆棧信息。

 

 

 

Logstash環境安裝

一、上傳 logstash 安裝包,個人目錄爲 /usr/local/es/

二、解壓 tar –zxvf  logstash-6.4.3.tar.gz

三、在config目錄下放入test01.conf、test02.conf 讀入而且讀出日誌信息

 

演示效果

一、啓動./logstash -f ../config/test01.conf、./logstash -f ../config/test01.conf  分別指的是二個不一樣的配置文件,test01 是控制檯輸出 沒有添加時間 輸出,test02 是打印了時間。

二、啓動./elasticsearch

三、啓動./kibana Logstash 讀取本地文件地址,實時存放在ES中,以天天格式建立不一樣的索引進行存放。

 

Kibana 平臺查詢 

GET /es-2019.06.12/_search

 

test01.conf

 

input {
# 從文件讀取日誌信息 輸送到控制檯
file {
path => "/usr/local/es/elasticsearch-6.4.3/logs/myes.log"
codec => "json" ## 以JSON格式讀取日誌
type => "elasticsearch"
start_position => "beginning"
}

}

 

# filter {
#
# }

 

output {
# 標準輸出
# stdout {}
# 輸出進行格式化,採用Ruby庫來解析日誌
stdout { codec => rubydebug }
}

 

test02.conf

input {
# 從文件讀取日誌信息 輸送到控制檯
file {
path => "/usr/local/es/elasticsearch-6.4.3/logs/myes.log"
codec => "json" ## 以JSON格式讀取日誌
type => "elasticsearch"
start_position => "beginning"
}
}

# filter {
#
# }

output {
# 標準輸出
# stdout {}
# 輸出進行格式化,採用Ruby庫來解析日誌
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.200.135:9200"]
#### 建立索引 根據天天建立索引
index => "es-%{+YYYY.MM.dd}"
}
}

ES與Mysql保持數據一致性原理

logstash包含輸入(讀取本地文件或者鏈接數據庫)與輸出、過濾器。

若是數據新增或者修改了,ES 與 數據庫如何保持一致性?

logstash作定時任務(每分鐘查詢一次),定時去mysql查詢數據。
原理:根據updateTime字段做爲條件進行查詢。第一次發送Sqli請求的時候,修改時間參數值是爲系統最開始的時間是1970年,能夠查詢到全部的數據。會將最後一條數據的updateTime記錄下來,做爲下一次修改時間的條件進行查詢。
第一次查詢 sql: SELECT * FROM user WHERE update_time >= '1970-01-01 08:00:00'; // updateTime 系統開始時間:1970-01-01 08:00:00
第二次查詢 sql:  SELECT * FROM user WHERE update_time >= '2019-07-13 11:15:23';// 2019-07-13 11:15:23 是 第一次查詢的全部數據中,最後一條數據的 updateTime
以下圖:能夠看到定時任務查詢的sql,還有定時爲1分鐘查一次。

 

新增數據或者修改數據的時候都會記錄updateTime 時間。

 

 

該博客內容來自螞蟻課堂:http://www.mayikt.com/

相關文章
相關標籤/搜索