最近組長安排我一項任務:利用ELK日誌分析平臺收集一個項目的日誌;期間也遇到各類問題,便想記錄下來,但願在記錄我成長的過程當中,爲你們帶來一點點幫助~~(若是存在有錯誤的地方,但願批評指正!)前端
1、概念介紹linux
ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成:web
1)ElasticSearch是一個基於Lucene的開源分佈式搜索服務器。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。
在elasticsearch中,全部節點的數據是均等的。
2)Logstash是一個徹底開源的工具,它能夠對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供之後使用(如搜索)。說到搜索,logstash帶有一個web界面,搜索和展現全部日誌。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。
3)Kibana 是一個基於瀏覽器頁面的Elasticsearch前端展現工具,也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。正則表達式
2、Logstashredis
1)輸入(input):採集各類樣式、大小和來源的數據數據庫
數據每每以各類各樣的形式,或分散或集中地存在於不少系統中。Logstash 支持各類輸入支持(file,syslog,redis,beats) ,能夠在同一時間從衆多經常使用來源捕捉事件。可以以連續的流式傳輸方式,輕鬆地從您的日誌、指標、Web 應用、數據存儲以及各類 AWS 服務採集數據。json
file:從文件系統的文件中讀取;瀏覽器
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析;緩存
redis:從redis service中讀取;服務器
beats:從filebeat中讀取;
2)過濾(filter):實時解析和轉換數據
數據從源傳輸(input)到存儲庫的過程當中,Logstash 過濾器可以解析各個事件,識別已命名的字段以構建結構,並將它們轉換成通用格式,以便更輕鬆、更快速地分析和實現商業價值。
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要做用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
3)輸出(output):選擇您的存儲庫,導出您的數據
儘管 Elasticsearch 是咱們的首選輸出方向,可以爲咱們的搜索和分析帶來無限可能,但它並不是惟一選擇。Logstash 提供衆多輸出選擇,您能夠將數據發送到您要指定的地方,而且可以靈活地解鎖衆多下游用例。(在此處只詳細說明Elasticsearch)
elasticsearch:能夠高效的保存數據,而且可以方便和簡單的進行查詢。
3、ELK總體方案
Logstash是一個ETL工具,負責從每臺機器抓取日誌數據,對數據進行格式轉換和處理後,輸出到Elasticsearch中存儲。
Elasticsearch是一個分佈式搜索引擎和分析引擎,用於數據存儲,可提供實時的數據查詢。
Kibana是一個數據可視化服務,根據用戶的操做從Elasticsearch中查詢數據,造成相應的分析結果,以圖表的形式展示給用戶。
在這裏還用到redis做爲緩存使用。經過logstash蒐集日誌數據存入redis,再經過logstash對數據格式轉化處理後儲存到Elasticsearch中。
4、Logstash在linux下的安裝部署
1)首先從官網 https://www.elastic.co/downloads 下載logstash 並解壓
2)編寫配置文件
--------------- test1.config
input:
path:指定日誌文件路徑。此處示例:能夠添加多個不一樣路徑的日誌文件;
type:指定一個名稱,設置type後,能夠在後面的filter和output中對不一樣的type作不一樣的處理,適用於須要消費多個日誌文件的場景。
start_position:指定起始讀取位置,"beginning"表示從文件頭開始,"end"表示從文件尾開始(相似tail -f).
sincedb_path:與Logstash的一個坑有關。一般Logstash會記錄每一個文件已經被讀取到的位置,保存在sincedb中,若是Logstash重啓,那麼對於同一個文件,會繼續從上次記錄的位置開始讀取。若是想從新從頭讀取文件,須要刪除sincedb文件,sincedb_path則是指定
了該文件的路徑。爲了方便,咱們能夠根據須要將其設置爲「/dev/null」,即不保存位置信息。
output:
host:redis所在服務器地址;
port:端口號;
data_type:
list:使用rpush
channel:使用publish
key:發佈通道名稱;
password:redis密碼,默認不使用密碼;
db:使用redis的數據庫,默認使用0號;
input { file { path => ["/data/log/test1.log","/data/log/test2.log","/data/home/test2.log",.....] start_position => "beginning" sincedb_path => "/dev/null" } } #輸入到redis output { redis { host => "XXX" port => "XXX" data_type => "list" key => "XXXX" db => XX password => "XXX" } }
-------------- test2.config
input:
上一個配置文件的輸出即爲該配置文件的輸入(對應的字段信息要保持一致)
filter:
此處就介紹我在處理日誌用到的相關過濾插件;
drop():從配置文件能夠看出若是message(即:輸出的每條日誌信息)不包含字符串「response_log_」就丟棄過濾該條日誌,開始處理下一條日誌。
grok:過濾掉不想要的日誌,想要的的日誌咱們就要經過grok進行下一步處理;此處經過正則表達式摳出本身想要的json部分信息,並存放在mesg字段裏。
json:再進一步的對mesg進行json解析,放入到logs字段,處理結束後就把不須要的message、mesg刪除掉;
(對於logstash 的filter詳細功能介紹可經過官網查看)
output:
最後將處理後的結果存入到es中(把日誌進行json解析是爲了提升es查詢搜索效率)
#須要處理的日誌(示例)
2018-08-08T07:22:44.266Z ds01 2018-07-24 16:15:16.528 INFO 18879 --- [XNIO-2 task-150] c.i.s.gateway.controller.test: _response_log_{"clientInfo":"test"}
input { redis { host => "XXX" port => "XXX" data_type => "list" key => "XXXX" db => XX password => "XXX" } } filter{ if([message] =~ "^(?!.*?response_log_).*$")){ drop {} } grok { match=>{"message" => ".*response_log_(?<mesg>(.*))"} } json { source => "mesg" target => "logs" remove_field=>["mesg"] remove_field=>["message"] } } output{ elasticsearch { index => "XXXX" hosts => ["XXXXX:XXX"] } }
運行logstash:bin/logstash -f ./configs/ (configs與bin處於同級目錄test1.conf、test2.conf處於configs目錄下)這種寫法能夠自動執行該目下的全部配置文件,單個執行也是能夠的。
最後經過Kibana查詢結果以下圖所示: