一、 簡介 1.1 介紹 ELK是三個開源工具組成,簡單解釋如下: Elasticsearch是個開源分散式搜索引擎,它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多數據源,自動搜索負載等。 Logstash是一個完全開源的工具,它可以對你的日誌進行收集、 ...
一、 簡介
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
# 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
# tar -zxvf elasticsearch-5.6.3.tar.gz # mv elasticsearch-5.6.3 /data/elasticsearch # cd elasticsearch/config/ # 備份配置文件 # cp elasticsearch.yml elasticsearch.yml.bak
編輯配置文件
# 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啟動
# groupadd -g 1008 elasticsearch # useradd -g 1008 -u 1008 elasticsearch # chown -R elasticsearch:elasticsearch /data/elasticsearch/
修改sysctl.conf文件
# vim /etc/sysctl.conf vm.max_map_count = 262144 # sysctl -p
修改/etc/security/limits.conf文件,修改打開文件句柄
* soft nofile 100000 * hard nofile 100000 * soft nproc 100000 * hard nproc 100000
添加hosts文件
# vim /etc/hosts 172.16.220.248 node-1
啟動
# su -s elasticsearch # cd /data/elasticsearch/bin # ./elasticearch &
查看是否啟動
簡單的curl測試
# curl http://172.16.220.248:9200
三、安裝Logstash和filebeat
filebeat用於在各個伺服器上獲取數據,發送到logstash上,再由logstash處理數據。
3.1 安裝logstash
# tar -zxvf logstash-5.6.3.tar.gz # mv logstash-5.6.3 /data/logstash
3.2 安裝filebeat
下載filebeat並啟動,通過它來監聽數據源文件的新增內容經過logstash處理後上傳到es裡面
# 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文件
filebeat.prospectors: - input_type: log paths: - /var/log/message-log # 測試本機的一個log文件 output.logstash: hosts: ["172.16.220.248:5044"]
啟動filebeat服務
# cd /data/filebeat # ./filebeat &
查看啟動,filebeat沒有監聽埠,主要看日誌和進程
# tialf logs/filebeat # ps -ef | grep filebeat
filebeat監聽的文件記錄信息在/data/filebeat/data/registry
新建一個本地文件message-log,可以取幾條本機系統的messages文件
3.3 啟動logstash
最後新建一個logstash的啟動指定test.conf配置文件,內容如下:
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不指定配置文件啟動
# cd /data/filebeat/bin # ./logstash -e 'input { stdin {} } output {stdout {} }'
我們手動輸入 hello world,它也會輸出 hello world
指定配置文件啟動logstash
# ./logstash -f ../config/test.conf &
查看5044埠和9600埠是否開啟
等待一會後應該會出現如下信息輸出,這也就是test.conf裡面最後一行定義輸出到屏幕上
四、安裝kibana
# 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配置文件
# vim kibana.yml server.port: 5601 server.host: "172.16.220.248" elasticsearch.url: "http://172.16.220.248:9200"
啟動kinbana
# 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
# 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配置文件
# 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
# ./filebeat &
5.2 重新配置logstash啟動配置文件
nginx日誌格式,根據業務要求,我們這做了一些修改,比如增加cookie等,修改access.log日誌時間格式等,這個會在另外的博客中寫出來,會給出鏈接的。
Nginx日誌格式
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使用表達式
可能我理解不是很到位,寫的也比較複雜,我會把匹配對應項一一寫出來,大家可以自己理解,然後為自己的項目配置
%{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匹配說明
%{SYSLOG5424SD} |
時間格式 |
%{IPV4:clientip} |
獲取ip,clientip是自己命名的 |
%{NUMBER:clientport} |
NUMBER匹配數字 |
%{INT:upstream_status} |
INT整形 |
%{WORD:method} |
WORD單詞 |
%{URIPATHPARAM:request} |
獲取請求內容request |
%{QS:url} |
QS可以獲取一段字元串 |
修改logstash啟動配置文件
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 } }
測試一下配置文件
./logstash -t -f ../config/logstash.conf
重啟logstash
不出問題elasticsearch 和kibana中就會有數據了