前言
近來比較閑,加之boss指派任務(wù)要研究日志收集系統(tǒng),所以選擇了ELK整套工具進(jìn)行研究。
數(shù)據(jù)庫日志收集這塊,本人屬于小白,一點都不懂,大多是查閱網(wǎng)上各大大神的文章和官網(wǎng)的教程一步一步摸索搭建起來,從環(huán)境搭建到集群配置,再到動態(tài)獲取數(shù)據(jù)庫日志,一路跌跌撞撞實屬不易,因此打算把踩過的坑記錄下來,給所有想了解或者接觸ELK的小白做參考。
本文參考了大量的教程,會在文章底部標(biāo)明出處。
ELK簡介
Elasticsearch
Elasticsearch是一個實時的分布式搜索分析引擎, 它能讓你以一個之前從未有過的速度和規(guī)模,去探索你的數(shù)據(jù)。它被用作全文檢索、結(jié)構(gòu)化搜索、分析以及這三個功能的組合:
* Wikipedia使用Elasticsearch提供帶有高亮片段的全文搜索,還有search-as-you-type和did-you-mean的建議。
*衛(wèi)報 使用Elasticsearch將網(wǎng)絡(luò)社交數(shù)據(jù)結(jié)合到訪客日志中,實時的給它的編輯們提供公眾對于新文章的反饋。
* Stack Overflow將地理位置查詢?nèi)谌肴臋z索中去,并且使用more-like-this接口去查找相關(guān)的問題與答案。
* GitHub使用Elasticsearch對1300億行代碼進(jìn)行查詢。
然而Elasticsearch不僅僅為巨頭公司服務(wù)。它也幫助了很多初創(chuàng)公司,像Datadog和Klout, 幫助他們將想法用原型實現(xiàn),并轉(zhuǎn)化為可擴(kuò)展的解決方案。Elasticsearch能運(yùn)行在你的筆記本電腦上,或者擴(kuò)展到上百臺服務(wù)器上去處理PB級數(shù)據(jù)。
Elasticsearch中沒有一個單獨的組件是全新的或者是革命性的。全文搜索很久之前就已經(jīng)可以做到了, 就像早就出現(xiàn)了的分析系統(tǒng)和分布式數(shù)據(jù)庫。革命性的成果在于將這些單獨的,有用的組件融合到一個單一的、一致的、實時的應(yīng)用中。它對于初學(xué)者而言有一個較低的門檻, 而當(dāng)你的技能提升或需求增加時,它也始終能滿足你的需求。
Logstash
Logstash是一款強(qiáng)大的數(shù)據(jù)處理工具,它可以實現(xiàn)數(shù)據(jù)傳輸,格式處理,格式化輸出,還有強(qiáng)大的插件功能,常用于日志處理。

工作流程
Logstash工作的三個階段:

input數(shù)據(jù)輸入端,可以接收來自任何地方的源數(shù)據(jù)。
* file:從文件中讀取
* syslog:監(jiān)聽在514端口的系統(tǒng)日志信息,并解析成RFC3164格式。
* redis:從redis-server list中獲取
* beat:接收來自Filebeat的事件
Filter數(shù)據(jù)中轉(zhuǎn)層,主要進(jìn)行格式處理,數(shù)據(jù)類型轉(zhuǎn)換、數(shù)據(jù)過濾、字段添加,修改等,常用的過濾器如下。
* grok:通過正則解析和結(jié)構(gòu)化任何文本。Grok目前是logstash最好的方式對非結(jié)構(gòu)化日志數(shù)據(jù)解析成結(jié)構(gòu)化和可查詢化。logstash內(nèi)置了120個匹配模式,滿足大部分需求。
* mutate:在事件字段執(zhí)行一般的轉(zhuǎn)換??梢灾孛h除、替換和修改事件字段。
* drop:完全丟棄事件,如debug事件。
* clone:復(fù)制事件,可能添加或者刪除字段。
* geoip:添加有關(guān)IP地址地理位置信息。
output是logstash工作的最后一個階段,負(fù)責(zé)將數(shù)據(jù)輸出到指定位置,兼容大多數(shù)應(yīng)用,常用的有:
* elasticsearch:發(fā)送事件數(shù)據(jù)到Elasticsearch,便于查詢,分析,繪圖。
* file:將事件數(shù)據(jù)寫入到磁盤文件上。
* mongodb:將事件數(shù)據(jù)發(fā)送至高性能NoSQL mongodb,便于永久存儲,查詢,分析,大數(shù)據(jù)分片。
* redis:將數(shù)據(jù)發(fā)送至redis-server,常用于中間層暫時緩存。
* graphite:發(fā)送事件數(shù)據(jù)到graphite。http://graphite.wikidot.com/
* statsd:發(fā)送事件數(shù)據(jù)到statsd。
kibana
kibana是一個開源和免費的工具,它可以為Logstash和ElasticSearch提供的日志分析友好的Web界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。
ELK安裝
MacOS安裝ELK5.x以上版本(初略介紹)
安裝前需準(zhǔn)備:
brew
brew又叫Homebrew,是Mac OSX上的軟件包管理工具,能在Mac中方便的安裝軟件或者卸載軟件,只需要一個命令, 非常方便。
Java
elasticsearch需要1.7以上版本,所以還需要安裝Java 1.7,用簡單的brew又不行,還需要先安裝cask。
brewinstall brew-cask
brewupdate
brewcask install caskroom/versions/java7
查看Java版本
java–version
安裝Elasticsearch:
brew install elasticsearch //安裝Elasticsearch
elasticsearch – version //查看Elasticsearch版本信息
通過
brewservices start elasticsearch
brewservices stop elasticsearch
啟停elasticsearch服務(wù)
瀏覽器訪問http://localhost:9200可以看到Elasticsearch的信息
{
name:"bWXgrRX",
cluster_name:"elasticsearch_ywheel",
cluster_uuid:"m99a1gFWQzKECuwnBfnTug",
version:{
number:"5.2.2",
build_hash:"f9d9b74",
build_date:"2017-02-24T17:26:45.835Z",
build_snapshot:false,
lucene_version:"6.4.1"
},
tagline:"You Know, for Search"
}
安裝logstash:
brew install logstash
安裝好后查看版本:
logstash – version
安裝Kibana:
Kibana不需要通過brew安裝,直接下載壓縮包后,解壓后執(zhí)行./kibana即可。
Kibana安裝完成后,需要在config/kibana.yml文件中,確認(rèn)elasticsearch.url:http://localhost:9200
配置logstash
使用logstash能夠很方便的寫入elasticsearch。 首先得生成一個logstash的conf文件,必須要在用戶目錄下創(chuàng)建一個*.conf文件
conf:
input {
file {
path=>"/Users/haigui/Desktop/LogInfo/*.log"
start_position=> beginning
ignore_older=> 0
sincedb_path=>"/dev/null"
}
filter {
grok {
match=> {"message"=>"%{IPORHOST:clientip}- %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?:HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-)"}}
date {match=> ["timestamp","dd/MMM/YYYY:HH:mm:ss+0800"]}
}
output {
elasticsearch{}
stdout {}
}
其中path => "/Users/haigui/Desktop/LogInfo/*.log"為日志路徑
使用
logstash-f ~/Desktop/*.conf
來讀取logstash配置文件
通過kibana窗口觀察你的結(jié)果:
http://localhost:5601
一開始是在setting頁面,要你指定訪問的index,這里就用缺省的logstash-*就行了。
CentOS7.0安裝ELK
用CentOS7.0是公司要求,其他系統(tǒng)都是可以參考的,在配置過程中會涉及系統(tǒng)參數(shù)修改,權(quán)限修改就不在文中說明了
安裝前需準(zhǔn)備:
為了安裝時不出錯,建議選擇這兩者選擇一樣的版本,全部選擇5.3版本。
System:Centos release 7.3
Java:Oracle-jdk version "1.8.0_131"
ElasticSearch:5.3.1
Elasticsearch官方建議使用Oracle的JDK8,在安裝之前首先要確定下機(jī)器有沒有安裝JDK.
rpm-qa | grep java
如果有,有可能是系統(tǒng)自帶的openjdk,而非oracle的jdk。可以使用
rpm–e --nodeps java-1.8.0-openjdk-headless-1.8.0.101-3.b13.el7_2.x86_64
卸載所有帶有Java的文件,然后進(jìn)行重新安裝。
檢查是否刪除
java–version
將jdk-8u131-linux-x64.tar放入/usr/local目錄下并解壓縮
將以下內(nèi)容添加至/etc/profile
#set java environment
exportJAVA_HOME=/usr/local/jdk1.8.0_131
exportJRE_HOME=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/lib/dt.JAVA_HOME/lib/tools.jar:${JRE_HOME}/lib
exportPATH=${JAVA_HOME}/bin:${PATH}
保存后運(yùn)行source /etc/profile使環(huán)境變量生效
輸入java -version確認(rèn)是否安裝成功。
[root@localhostlocal]# java -version
javaversion "1.8.0_131"
Java(TM)SE Runtime Environment (build 1.8.0_131-b13)
JavaHotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
安裝elasticsearch
elasticsearch安裝地址
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.1.tar.gz
將elasticsearch-5.3.1.tar解壓到/home/parallels/Desktop/elasticsearch中,修改elasticsearch-5.3.1/config/elasticsearch.yml中:
#這里指定的是集群名稱,需要修改為對應(yīng)的,開啟了自發(fā)現(xiàn)功能后,ES會按照此集群名稱進(jìn)行集群發(fā)現(xiàn)
cluster.name:thh_dev1
#數(shù)據(jù)目錄
path.data:/home/parallels/Desktop/data/elk/data
# log目錄
path.logs:/home/parallels/Desktop/data/elk/logs
#修改一下ES的監(jiān)聽地址,這樣別的機(jī)器也可以訪問
network.host:0.0.0.0
#默認(rèn)的端口號
http.port:9200
修改系統(tǒng)參數(shù),確保系統(tǒng)有足夠資源啟動ES
設(shè)置內(nèi)核參數(shù)
/etc/sysctl.conf
#增加以下參數(shù)
vm.max_map_count=655360
執(zhí)行以下命令,確保生效配置生效:
sysctl–p
設(shè)置資源參數(shù)
/etc/security/limits.conf
#修改
*soft nofile 65536
*hard nofile 131072
*soft nproc 65536
*hard nproc 131072
vi/etc/security/limits.d/20-nproc.conf
#設(shè)置elk用戶參數(shù)
elksoftnproc65536
啟動ElasticSearch5版本要非root用戶,使用一個普通用戶來啟動ElasticSearch
進(jìn)入elasticsearch的bin目錄,使用./elasticsearch -d命令啟動elasticsearch。
使用
ps-ef|grep elasticsearch
查看進(jìn)程
使用
curl-X GEThttp://localhost:9200
查看信息
{
"name" : "FIinCQT",
"cluster_name" :"thh_dev1",
"cluster_uuid" :"Xm1PGPNuT6e5gBv3aF9aew",
"version" : {
"number" : "5.3.1",
"build_hash" :"5f9cf58",
"build_date" :"2017-04-17T15:52:53.846Z",
"build_snapshot" : false,
"lucene_version" :"6.4.2"
},
"tagline" : "You Know, forSearch"
}
客戶端網(wǎng)頁訪問可能需要關(guān)掉防火墻:
systemctlstop firewalld.service
安裝logstash:
下載logstash
https://artifacts.elastic.co/downloads/logstash/logstash-5.3.1.tar.gz
首先將logstash-5.3.1.tar.gz解壓到/home/parallels/Desktop/logstash中
創(chuàng)建配置文件
創(chuàng)建logstash-simple.conf文件并且保存到
/home/parallels/Desktop/logstash/config
文件內(nèi)容為
input{
file {
path => "/home/parallels/Desktop/data/elk/logs/*.log"
start_position => beginning
ignore_older => 0
sincedb_path =>"/dev/null"
}}
filter{
grok {
match => { "message" =>"%{IPORHOST:clientip} - %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb}%{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\"%{NUMBER:response} (?:%{NUMBER:bytes}|-)"}
}date {
match => [ "timestamp" ,"dd/MMM/YYYY:HH:mm:ss +0800" ]
}
}
output{
elasticsearch {}
stdout {}
}
其中path => "/home/parallels/Desktop/data/elk/logs/*.log"為日志路徑
Grok后面是正則表達(dá)式,篩選logstash要讀取的關(guān)鍵信息。
進(jìn)入logstash的bin目錄,使用./logstash -f ../config/logstash-simple.conf命令讀取配置信息并啟動logstash。
安裝kibana:
下載kibana
https://artifacts.elastic.co/downloads/kibana/kibana-5.3.1-linux-x86_64.tar.gz
解壓kibana-5.3.1-linux-x86_64源碼包到/home/parallels/Desktop/kibana
配置kibana
編輯kibana.yml配置文件
/home/parallels/Desktop/kibana/config/kibana.yml
修改以下參數(shù):
#開啟默認(rèn)端口5601如果5601被占用可用5602或其他
server.port:5601
server.host:“l(fā)ocalhost”#站點地址
elasticsearch.url:http://localhost:9200#指向elasticsearch服務(wù)的ip地址
kibana.index:“.kibana”
運(yùn)行cd /home/parallels/Desktop/kibana/bin運(yùn)行./kibana
通過kibana窗口觀察你的結(jié)果:
http://localhost:5601
一開始是在setting頁面,要你指定訪問的index,這里就用缺省的logstash-*就行了。

這樣ELK搭建就完成了
參考文獻(xiàn)