基於ELK的日誌分析/存儲/展示
背景介紹
在我們日常生活中,我們經常需要回顧以前發生的一些事情;或者,當出現了一些問題的時候,可以從某些地方去查找原因,尋找發生問題的痕跡。無可避免需要用到文字的、圖像的等等不同形式的記錄。用計算機的術語表達,就是 LOG,或日誌。
日誌,對於任何系統來說都是及其重要的組成部分。在計算機系統裏面,更是如此。但是由於現在的計算機系統大多比較複雜,很多系統都不是在一個地方,甚至都是跨國界的;即使是在一個地方的系統,也有不同的來源,比如,操作系統,應用服務,業務邏輯等等。他們都在不停產生各種各樣的日誌數據。根據不完全統計,我們全球每天大約要產生 2EB(1018)的數據。
面對如此海量的數據,又是分佈在各個不同地方,如果我們需要去查找一些重要的信息,難道還是使用傳統的方法,去登陸到一臺臺機器上查看?看來傳統的工具和方法已經顯得非常笨拙和低效了。於是,一些聰明人就提出了建立一套集中式的方法,把不同來源的數據集中整合到一個地方。
一個完整的集中式日誌系統,是離不開以下幾個主要特點的:
- 收集-能夠採集多種來源的日誌數據
- 傳輸-能夠穩定的把日誌數據傳輸到中央系統
- 存儲-如何存儲日誌數據
- 分析-可以支持 UI 分析
- 警告-能夠提供錯誤報告,監控機制
ELK簡介
ELK並不是一款軟件,而是一套完整的日誌解決方案,由Elasticsearch、Logstash、Kibana這三款開源軟件組成;通常是配合使用,而且又先後歸於 Elastic.co 公司名下,故被簡稱爲 ELK 協議棧
Elasticsearch是基於Lucene開發的分佈式存儲檢索引擎,用來存儲各類日誌;
Logstash對日誌進行收集、分析,並將其存儲供以後使用;
Kibana是基於Node.js開發的展示工具,爲Logstash和Elasticsearch提供用於日誌展示的web頁面,還用於幫助彙總、分析和搜索重要日誌數據。
基本流程是 logstash 負責從各種數據源裏採集數據,然後再寫入 Elasticsearch,Elasticsearch 對這些數據創建索引,然後由 Kibana 對其進行各種分析並以圖表的形式展示。
部署安裝ELK
- 實驗環境
主機名 | IP地址 | 相關軟件包 |
---|---|---|
CentOS7-1(linux-node1) | 172.16.10.138 | jdk、logstash、elasticsearch、kibana |
CentOS7-2(linux-node2) | 172.16.10.147 | jdk、elasticsearch |
- 安裝部署步驟
- 關閉兩臺服務器的防火牆
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
安裝Elasticsearch、java環境
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch //導入密鑰
cd /etc/yum.repo.d/
vim elasticsearch.repo //配置yum倉庫
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enable=1
yum list //重新加載yum倉庫
yum install elasticsearch -y
yum install java -y (1.8.0版本)
java -version //查看java環境的版本信息確認是否安裝
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
- 安裝完成後可以查看命令存放目錄
cd /usr/share/elasticsearch/bin
- 修改Elasticsearch的配置文件
vim /etc/elasticsearch/elasticsearch.yml
-------cluster羣集----------------
17行 集羣名稱
cluster.name: silence //開啓 (自定義)
---------node節點-----------------
23行 節點名稱
node.name: linux-node1 //開啓 (自定義)
-----------paths路徑------------
工作目錄
33:path.data: /data/es-data //數據存放位置
37:path.logs: /var/log/elasticsearch/ //日誌存放位置
43行 防止交換swap分區
bootstrap.memory_lock: true //鎖定內存
54行 監聽網絡
network.host: 0.0.0.0
58行 端口號
http.port: 9200
- 創建數據存放目錄、開啓服務
mkdir -p /data/es-data //創建數據存放目錄
chown -R elasticsearch:elasticsearch /data/es-data/ //修改屬主屬組信息
systemctl start elasticsearch.service //開啓服務
netstat -ntap | grep 9200 //檢查端口是否開啓
- web網頁測試
瀏覽器輸入 172.16.10.138:9200
- 可以使用兩種方法和ES進行交互
第一種 JAVA API
第二種 RESTful API (通過json格式交互)
- RESTful API (通過json格式交互)
curl -i -XGET 'http://172.16.10.147:9200/_count?pretty' -d '{
"query": {
"match_all": {}
}
}'
//輸出顯示
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 95
{
"count" : 0,
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
}
}
- 內存解鎖和文件限制
生產環境中必須要修改(注意)
vim /etc/security/limits.conf
G到行尾添加
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
* soft nofile 65535
* hard nofile 65535
//重啓生效 (生產環境中建議重啓)
- ES插件之elasticsearch-head
/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head //下載ES插件
安裝位置/usr/share/elasticsearch/plugins/head
- 網頁測試插件
瀏覽器訪問 172.16.10.138:9200/_plugin/head/
- 添加複合查詢測試
添加 複合查詢
/index-demo/test POST
{
"user":"tom",
"mesg":"hello world"
}
提交請求
----------返回顯示--------------
{
"_index": "index-demo",
"_type": "test",
"_id": "AWVDUuVUPJxKK7V6Dj8E",
"_version": 1,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}
- 部署ES羣集(在第二臺服務器上安裝部署Elasticsearch)
//這裏和上面部署第一臺是一樣的所以小編上命令,不同的地方小編會註明的哦!
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch //導入密鑰
cd /etc/yum.repo.d/
vim elasticsearch.repo //配置yum倉庫
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enable=1
yum list //重新加載yum倉庫
yum install elasticsearch -y
yum install java -y (1.8.0版本)
java -version //查看java環境的版本信息確認是否安裝
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
vim /etc/elasticsearch/elasticsearch.yml
-------cluster羣集----------------
17行 集羣名稱
cluster.name: silence //開啓 (自定義)
---------node節點-----------------
23行 節點名稱
node.name: linux-node1 //開啓 (自定義)
-----------paths路徑------------
工作目錄
33:path.data: /data/es-data //數據存放位置
37:path.logs: /var/log/elasticsearch/ //日誌存放位置
43行 防止交換swap分區
bootstrap.memory_lock: true //鎖定內存
54行 監聽網絡
network.host: 0.0.0.0
58行 端口號
http.port: 9200
69行 自動發現機制
discovery.zen.ping.unicast.hosts: ["172.16.10.147", "172.16.10.138"] //這裏選擇單播列表自動發現機制
mkdir -p /data/es-data //創建數據存放目錄
chown -R elasticsearch:elasticsearch /data/es-data/ //修改屬主屬組信息
- 第一臺節點服務器也要進行修改添加
vim /etc/elasticsearch/elasticsearch.yml
69行 自動發現機制
discovery.zen.ping.unicast.hosts: ["172.16.10.138", "172.16.10.147"] //這裏選擇單播列表自動發現機制
- 重啓第一臺節點服務器及開啓第二臺服務器
systemctl stop elasticsearch.service
systemctl start elasticsearch.service
- web頁面測試查看
瀏覽器訪問 172.16.10.138:9200/_plugin/head/
Logstash部署
簡單來說logstash就是一根具備實時數據傳輸能力的管道,負責將數據信息從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可以讓你根據自己的需求在中間加上濾網,Logstash提供裏很多功能強大的濾網以滿足你的各種應用場景。
- 安裝Logstash
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/logstash.repo
[logstash-2.1]
name=Logstash repository for 2.1.x packages
baseurl=http://packages.elastic.co/logstash/2.1/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enable=1
yum list
yum install logstash -y
- 定義輸入和輸出流,類似管道
/opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} }'
hello
- 詳細格式顯示
/opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
- 寫入到elasticsearch中
/opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["172.16.10.138:9200"] } }'
- 寫入ES和同時生成文本
/opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["172.16.10.138:9200"] } stdout { codec => rubydebug } }'
- 創建 logstash配置文件寫入
vim /etc/logstash/conf.d/01-logstash.conf
input { stdin { } }
output {
elasticsearch { hosts => ["172.16.10.138:9200"] }
stdout { codec => rubydebug }
}
/opt/logstash/bin/logstash -f /etc/logstash/conf.d/01-logstash.conf
- 使用logstash配置文件:
- 收集系統日誌
- 收集java異常日誌
- 事件優化處理
ln -s /opt/logstash/bin/logstash /usr/bin/
vim file.conf
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["172.16.10.138:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
logstash -f /root/file.conf
部署kibana
- 下載安裝kibana服務
wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz //這裏使用wget下載軟件包,也可以複製鏈接至迅雷下載好之後共享上傳
tar zxvf kibana-4.3.1-linux-x64.tar.gz -C /usr/local/
cd /usr/local/
mv kibana-4.3.1-linux-x64/ kibana
- 修改kibana的配置文件
vim /usr/local/kibana/config/kibana.yml
//2行
server.port: 5601 //開啓端口
//5行
server.host: "0.0.0.0" //允許訪問服務器的地址
//12行 ES地址
elasticsearch.url: "http://172.16.10.138:9200"
//20行
kibana.index: ".kibana"
screen是linux下的一種多重視窗管理程序。在使用telnet或SSH遠程登錄linux時,如果連接非正常中斷,重新連接時,系統將開一個新的session,無法恢復原來的session.screen命令可以解決這個問題。
yum install screen -y
- 啓動監聽
/usr/local/kibana/bin/kibana
ctrl+a+d 進行丟入後臺
http://172.16.10.138:5601/