ELK是由Elasticsearch、Logstash、Kibana三個組件組成的。
Elasticsearch:是ELK的核心插件,是一個基于Lucene的搜索服務器,它提供一個分布式多用戶能力的全文搜索引擎,能夠達到實時搜索,穩定,可靠,快速,安裝方便。Elasticsearch服務會開啟兩個端口,9200和9300,其中9200是對外服務的,9300是對集群內交互使用的。
Logstash:日志收集工具,可以從本地磁盤,網絡服務(自己監聽端口,接受用戶日志),消息隊列中收集各種各樣的日志。然后對日志進行分析整理,輸出到指定的輸出,(如elasticsearch、redis、終端等。)監聽9600端口。
Kibana:是一個可視化日志web展示工具,對Elasticsearch中存儲的日志進行展示。監聽5601端口。
在這里我直接三個組件裝在同一臺機器上面,也可以把他們分開。
192.168.40.15 elasticsearch logstash kibana
由于ES與logstash都需要JDK環境,所以要先安裝JDK環境,最好是安裝1.8或者以上的。
[root@elkserver ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
安裝ES:
[root@elkserver src]# tar -xf elasticsearch-5.6.3.tar.gz
[root@elkserver src]# mv elasticsearch-5.6.3/ /usr/local/elasticsearch
[root@elkserver src]# cd /usr/local/elasticsearch/
##修改配置文件:
[root@elkserver elasticsearch]# vim config/elasticsearch.yml
node.name: elkserver
network.host: 192.168.40.15
discovery.zen.minimum_master_nodes: 1
##在配置文件末尾添加:
http.cors.enabled: true
http.cors.allow-origin: "*" ##這兩句是為了后面安裝head插件使用的。
安裝head插件
head插件能夠生成集群的統計數據,并提供瀏覽器查詢,同時還能對elasticsearch索引進行結構化查詢。
cd /usr/local/elasticsearch
mkdir head
cd head
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head/
yum install -y npm* ##安裝npm命令
npm install ##運行緩慢
npm install -g grunt-cli
##修改配置文件
[root@elkserver elasticsearch-head]# vim Gruntfile.js connect: {server: {options: {port: 9100,hostname: '0.0.0.0', ##添加這行,冒號后面有空格base: '.',keepalive: true}}}
##修改elasticsearch的JVM運行內存,這個可以根據需要更改,但是-Xms和-Xmx的值必須一樣,不然啟動報錯[root@elkserver elasticsearch-head]# vim /usr/local/elasticsearch/config/jvm.options
-Xms1g
-Xmx1g
##修改Linux最大打開文件數
vim /etc/security/limits.conf
* soft nofile 655350 ##在末尾添加
* hard nofile 655350
[root@elkserver ~]# ulimit -n
655350
##修改sysctl.conf文件
[root@elkserver ~]# vim /etc/sysctl.conf
vm.max_map_count=655350
[root@elkserver ~]# sysctl -p
將ES的head插件啟動,然后創建普通用戶,啟動ES,ES只能使用普通用戶啟動
useradd elastic
passwd elastic##啟動head插件
[root@elkserver elasticsearch-head]# pwd
/usr/local/elasticsearch/head/elasticsearch-head
[root@elkserver elasticsearch-head]# grunt server &
##會開啟9100端口。
##切換到普通用戶啟動elasticsearch
[root@elkserver elasticsearch-head]# chown -R elastic:elastic /usr/local/elasticsearch/
[root@elkserver elasticsearch-head]# su - elastic
Last login: Sun Jun 10 13:15:09 CST 2018 on pts/0
[elastic@elkserver ~]$ nohup /usr/local/elasticsearch/bin/elasticsearch &
[1] 2339
[elastic@elkserver ~]$ nohup: ignoring input and appending output to ‘nohup.out’
##啟動成功是會開啟9200,9300兩個端口的。
##在瀏覽器打開可以利用head插件查看elasticsearch的集群及索引情況

安裝Logstash
Logstash也是需要jdk環境,所以如果是在不同機器上部署的,需要安裝jdk環境,版本可以選擇和ES一樣的。
[root@elkserver src]# tar -xf logstash-5.6.3.tar.gz
[root@elkserver src]# mv logstash-5.6.3 /usr/local/logstash
##創建日志處理文件的存放目錄
mkdir /logstash
cd /logstash
##接下來是重點,也是ELK的難點吧,就是將日志進行分析,使用正則匹配過濾日志中想要的內容。
120.79.189.51 - - [10/Jun/2018:12:58:12 +0800] "POST /wp-cron.php?doing_wp_cron=1528606692.3628709316253662109375 HTTP/1.1" 499 0 "-" "WordPress/4.8; http://120.79.189.51"這是日志中的一行,logstash的正則匹配默認是匹配一行,以回車符作為分隔符。
當然如果日志是json格式的那么就沒有需要處理直接輸出即可。
[root@elkserver logstash]# cat input_flter_output.conf
input {file {path => "/logstash/test.log"type => "test.log"start_position => "beginning"}
}
filter {grok {match => {"message" => "(?<ip_addr>\d+?\.\d+?\.\d+?\.\d+?)\s-\s-\s\[(?<log_date>\d+?/\w+?/\d+?):(?<log_time>\d+?:\d+?:\d+?)\s+"}}}
output {stdout {codec => rubydebug}
}
這是logstash的日志分析文件,總共分為三個大部分,input、flter、output,其中input是輸入日志,這里選擇的是file文件,path是文件的路徑,type是文件的類型,這個可以自定義,主要用來區分每個日志,start_position是設定為beginning是指從文件的開頭開始讀取。
flter是處理日志的部分,使用grok這個強大的組件進行信息過濾,對于日志的正則匹配最總會以json的格式輸出,所以正則匹配的格式是(?<字段名>正則表達式過濾將要匹配的內容)在每個括號內創建過濾的內容,將不需要的內容放在括號外,可以一直做匹配知道日志結束,這里我只是簡單匹配日志前面的ip地址和日期時間。
針對正則匹配字段詳細說明:
正則匹配字段通過“(?<字段名>正則表達式)”來定義,我們看到“(?<ip_addr>\d+?\.\d+?\.\d+?\.\d+?”匹配了日志中的IP地址,然后將不需要的內容放在括號外面匹配,接著是日期和時間,使用同樣的方式,然后不需要的內容放在外面因為這里我只匹配了前面的一點內容,如果有需要提取,可以一直匹配,知道這一行結束,logstash默認只會匹配日志以行作為分割,下一行又是新的一次匹配了。output是處理輸出部分,這里我只是簡單輸出到終端,先實驗正則匹配沒問題后,將輸出指向elasticsearch。
##這里先看看終端的輸出內容,也就是經過logstash過濾后的日志

接下來將日志輸出到elasticsearch,修改output里面的內容即可。
output {elasticsearch { ##指定輸出到ESaction => "index" ##建立索引hosts => "192.168.40.15:9200" ##ES地址端口index => "test_log-%{+yyyy.MM.dd}" ##索引的名稱}stdout {codec => rubydebug}
}
然后再執行一次
/usr/local/logstash/bin/logstash -f input_flter_output.conf
安裝kibana
[root@elkserver src]# rpm -ivh kibana-5.6.3-x86_64.rpmvim /etc/kibana/kibana.yml
server.host: "192.168.40.15" ##指定本地server地址
elasticsearch.url: "http://192.168.40.15:9200" ##指定elasticsearch對外服務的url
接下來就是直接在瀏覽器打開kibana的web界面,然后建立索引庫,索引是只想elastic的,在logstash日志分析文件里面有建立了一個索引,索引的名稱是test_log-${日期}這樣的形式。
訪問kibana:http://192.168.40.15:5601
輸入相應的索引,然后建立索引庫,然后就可以制作各種各樣的圖形分析日志,kibana提供了很多中圖形,根據需要選擇分析。
記得ELK是實時的日志分析,所以kibana的web界面右上角的時間如果設置不好就看不到導入的日志了。
轉載于:https://blog.51cto.com/lsfandlinux/2127235