、 簡介
1.1 介紹
ELK是三個開源工具組成,簡單解釋如下:
Elasticsearch是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
Logstash是一個完全開源的工具,它可以對你的日志進行收集、過濾,並將其存儲供以后使用(如,搜索)。
Kibana 也是一個開源和免費的工具,它可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日志。
1.2 場景分析
日志主要包括系統日志、應用程序日志和安全日志等等。運維人員和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷,性能安全性,從而及時采取措施糾正錯誤。
通常,日志被分散的儲存不同的設備上。如果你管理數十上百台服務器,你還在使用依次登錄每台機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日志管理,例如:開源的syslog,將所有服務器上的日志收集匯總。
集中化管理日志后,日志的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
這里采用開源實時日志分析ELK平台能夠完美的解決我們上述的問題,當然也還有別的平台或者工具可以使用,這里只討論ELK,官方網站:https://www.elastic.co
二、安裝Elasticsearch
2.1 安裝jdk
1
2
3
4
|
# java -version
java version
"1.8.0_121"
Java(TM) SE Runtime Environment (build
1.8
.
0_121
-
b13)
Java HotSpot(TM)
64
-
Bit Server VM (build
25.121
-
b13, mixed mode)
|
2.2 安裝Elasticsearch
1
2
3
4
5
|
# tar -zxvf elasticsearch-5.6.3.tar.gz
# mv elasticsearch-5.6.3 /data/elasticsearch
# cd elasticsearch/config/
# 備份配置文件
# cp elasticsearch.yml elasticsearch.yml.bak
|
編輯配置文件
1
2
3
4
5
6
7
8
9
|
# cat elasticsearch.yml | grep -v ^#
cluster.name: elk
-
application
node.name: node
-
1
path.data:
/
data
/
elasticsearch
/
data
path.logs:
/
data
/
elasticsearch
/
logs
network.host:
172.16
.
220.248
http.port:
9200
discovery.zen.ping.unicast.hosts: [
"node-1"
]
discovery.zen.minimum_master_nodes:
1
|
添加elasticsearch用戶,不能使用root啟動
1
2
3
|
# groupadd -g 1008 elasticsearch
# useradd -g 1008 -u 1008 elasticsearch
# chown -R elasticsearch:elasticsearch /data/elasticsearch/
|
修改sysctl.conf文件
1
2
3
4
|
# vim /etc/sysctl.conf
vm.max_map_count
=
262144
# sysctl -p
|
修改/etc/security/limits.conf文件,修改打開文件句柄
1
2
3
4
|
*
soft nofile
100000
*
hard nofile
100000
*
soft nproc
100000
*
hard nproc
100000
|
添加hosts文件
1
2
|
# vim /etc/hosts
172.16
.
220.248
node
-
1
|
啟動
1
2
3
|
# su -s elasticsearch
# cd /data/elasticsearch/bin
# ./elasticearch &
|
查看是否啟動
簡單的curl測試
1
|
# curl http://172.16.220.248:9200
|
三、安裝Logstash和filebeat
filebeat用於在各個服務器上獲取數據,發送到logstash上,再由logstash處理數據。
3.1 安裝logstash
1
2
|
# tar -zxvf logstash-5.6.3.tar.gz
# mv logstash-5.6.3 /data/logstash
|
3.2 安裝filebeat
下載filebeat並啟動,通過它來監聽數據源文件的新增內容經過logstash處理后上傳到es里面
1
2
3
4
|
# tar -zxvf filebeat-5.6.3-linux-x86_64.tar.gz
# mv filebeat-5.6.3-linux-x86_64 /data/filebeat
# cd /data/filebeat
# cp filebeat.yml filebeat.yml.bak
|
編輯filebeat.yml文件
1
2
3
4
5
6
|
filebeat.prospectors:
-
input_type: log
paths:
-
/
var
/
log
/
message
-
log
# 測試本機的一個log文件
output.logstash:
hosts: [
"172.16.220.248:5044"
]
|
啟動filebeat服務
1
2
|
# cd /data/filebeat
# ./filebeat &
|
查看啟動,filebeat沒有監聽端口,主要看日志和進程
1
2
|
# tialf logs/filebeat
# ps -ef | grep filebeat
|
filebeat監聽的文件記錄信息在/data/filebeat/data/registry
新建一個本地文件message-log,可以取幾條本機系統的messages文件
3.3 啟動logstash
最后新建一個logstash的啟動指定test.conf配置文件,內容如下:
1
2
3
4
5
6
7
8
9
10
11
|
input
{
beats {
port
=
>
"5044"
}
}
output {
elasticsearch {
hosts
=
>
"172.16.220.248:9200"
}
stdout { codec
=
> rubydebug }
# 這是將輸出打印在屏幕上,可以注釋掉
}
|
Logstash默認有input、filter、output三個區域,一般最少需要配置input和output即可!
logstash的本身默認的logstash.yml配置文件選擇不修改即可!
簡單測試一下logstash不指定配置文件啟動
1
2
|
# cd /data/filebeat/bin
# ./logstash -e 'input { stdin {} } output {stdout {} }'
|
我們手動輸入 hello world,它也會輸出 hello world
指定配置文件啟動logstash
1
|
# ./logstash -f ../config/test.conf &
|
查看5044端口和9600端口是否開啟
等待一會后應該會出現如下信息輸出,這也就是test.conf里面最后一行定義輸出到屏幕上
四、安裝kibana
1
2
3
4
|
# tar -zxvf kibana-5.6.3-linux-x86_64.tar.gz
# mv kibana-5.6.3-linux-x86_64 /data/kinbana
# cd /data/kinbana/config/
# cp kibana.yml kibana.yml.bak
|
編輯kibana.yml配置文件
1
2
3
4
|
# vim kibana.yml
server.port:
5601
server.host:
"172.16.220.248"
elasticsearch.url:
"http://172.16.220.248:9200"
|
啟動kinbana
1
2
|
# cd /data/kibana/bin
# ./kibana &
|
查看端口
瀏覽器登入查看
點擊create按鈕后,然后點擊上面的discover按鈕,注意如果沒數據的話,注意看看導入的時間@timestamp和現在的時間對比一下,kibana默認只顯示最近15分鍾的數據,如果超出15分鍾請選擇適當的時間,從kibana可以看到messages-log里面的15條數據都正常導入了。這就也完成我們的實現的第一個效果。但是這僅僅是把流程跑通了,接下來我們需要做的事情還有更多。注意只能先導入數據到es后才能在kibana創建索引。
五、獲取Nginx access日志
Nginx日志格式在logstash的grok里面默認是沒有的,需要我們手動配置,可以通過http://grokdebug.herokuapp.com/ 在線工具來判斷配置是否正確。
5.1 在nginx服務器上安裝filebeat
服務器: 172.16.200.160
1
2
3
4
|
# tar -zxvf filebeat-5.6.3-linux-x86_64.tar.gz
# mv filebeat-5.6.3-linux-x86_64 /data/filebeat
# cd /data/filebeat
# cp filebeat.yml filebeat.yml.bak
|
修改filebeat配置文件
1
2
3
4
5
6
7
8
|
# cat filebeat.yml | grep -v ^$ | grep -v ^# | grep -v "#"
filebeat.prospectors:
- input_type: log
paths:
- /data/nginx/logs/160_access.log
document_type: nginx_access
output.logstash:
hosts: ["172.16.220.248:5044"]
|
啟動filebeat
1
|
# ./filebeat &
|
5.2 重新配置logstash啟動配置文件
nginx日志格式,根據業務要求,我們這做了一些修改,比如增加cookie等,修改access.log日志時間格式等,這個會在另外的博客中寫出來,會給出鏈接的。
nginx日志中添加cookie信息
nginx改變access.log中的時間格式
Nginx日志格式
1
2
3
4
5
6
7
8
|
log_format main
'[$time_local] - $remote_addr:$remote_port - $upstream_addr $upstream_status $upstream_response_time - '
'"$request" $status $bytes_sent $request_time '
'"$http_referer" - "$http_user_agent" - '
'"$customerTag_cookie" - "$ym_cookie" - "$http_cookie" '
'"$http_x_forwarded_for"';
# 這里只是我們自己的格式,各位可以根據自己要求增刪
|
grok使用表達式
可能我理解不是很到位,寫的也比較復雜,我會把匹配對應項一一寫出來,大家可以自己理解,然后為自己的項目配置
1
|
%{SYSLOG5424SD} - %{IPV4:clientip}:%{NUMBER:clientport} - %{IPV4:hostip}:%{NUMBER:itemport} %{INT:upstream_status} %{NUMBER:response_time} - \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{INT:status} %{INT:body_bytes_sent} %{NUMBER:request_time} %{QS:url} - %{QS:user_agent} - %{QS:customerTag} - %{QS:ym_traffic_session_id} - %{QS:all_cookies} %{IPV4:realip}
|
grok匹配說明
|
時間格式 | ||
|
獲取ip,clientip是自己命名的 | ||
|
NUMBER匹配數字 | ||
|
INT整形 | ||
|
WORD單詞 | ||
|
獲取請求內容request | ||
|
QS可以獲取一段字符串 |
修改logstash啟動配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
input {
beats {
port => "5044"
}
}
filter {
if [type] == "nginx_access" {
grok {
match => {"message" => "%{SYSLOG5424SD} - %{IPV4:clientip}:%{NUMBER:clientport} - %{IPV4:hostip}:%{NUMBER:itemport} %{INT:upstream_status} %{NUMBER:response_time} - \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{INT:status} %{INT:body_bytes_sent} %{NUMBER:request_time} %{QS:url} - %{QS:user_agent} - %{QS:customerTag} - %{QS:ym_traffic_session_id} - %{QS:all_cookies} %{IPV4:realip}"}
}
mutate {
remove_field => "message" # 把message字段去掉,它會將上面單項獲取的信息做個匯總,這樣就重復了
}
}
}
output {
elasticsearch {
hosts => "172.16.220.248:9200"
}
#stdout { codec => rubydebug }
}
|
測試一下配置文件
1
|
./logstash -t -f ../config/logstash.conf
|
重啟logstash
不出問題elasticsearch 和kibana中就會有數據了