ELK(Elasticsearch + Logstash + Kibana) 是這兩三年來很火紅的日誌收集分析平台,尤其是 Logstash 的部分,提供了各式各樣的日誌收集及輸出的 Plugin,搭配 Elasticsearch 這種分散的索引搜尋系統,收集日誌只是一塊蛋糕而已,如果你有收集大量日誌的需求可以考慮用 ELK,畢竟 Splunk 很貴啊啊啊!
下面是我從安裝 ELK 到用 Kibana 拉出一個統計圖的過程。
安裝 Elasticsearch
請參考[料理佳餚] 在 CentOS 7 安裝 Elasticsearch 分散式搜尋系統這篇文章安裝 Elasticsearch。
關於 Elasticsearch 在 CentOS 7 底下的優化
Elasticsearch 有一些關於在 CentOS 7 底下記憶體、檔案等資源使用的最佳化參數,我特別記錄下來提供給大家參考。
關閉 Swapping
修改 /etc/elasticsearch/elasticsearch.yml 檔案,設定下列參數:
bootstrap.mlockall: true
修改 /etc/sysconfig/elasticsearch 檔案,設定下列參數:
MAX_LOCKED_MEMORY=unlimited
修改 /usr/lib/systemd/system/elasticsearch.service 檔案,設定下列參數:
LimitMEMLOCK=infinity
配置 Heap Size
修改 /etc/sysconfig/elasticsearch 檔案,設定下列參數:
ES_HEAP_SIZE=10g
Heap Size 預設是 256m ~ 1g,建議設定一個固定的值,但是不要超過實體記憶體的 50%,最大不要超過 32g。
開放對記憶體及檔案的安全性鎖定
修改 /etc/sysconfig/elasticsearch 檔案,設定下列參數:
MAX_OPEN_FILES=65535
修改 /etc/security/limits.conf 檔案,附加下列資訊:
elasticsearch - nofile 65535
elasticsearch - memlock unlimited
設定 FQDN(Fully Qualified Domain Name)
如果我們的訊息在傳輸的過程需要 SSL 加密,則這個步驟一定要做,這是在建立 SSL 憑證的時候需要用到。
修改 /etc/hostname 檔案,修改成下列內容:
elk.ooxxgg.com
修改 /etc/hosts 檔案,附加下列資訊:
127.0.0.1 xxyyzz
192.168.8.101 elk.ooxxgg.com elk
執行刷新系統環境指令
hostname -F /etc/hostname
產生 SSL 憑證(需要的話)
切換到 /etc/pki/tls 目錄,執行下列指令:
openssl req -subj '/CN=elk.ooxxgg.com/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
安裝 Kibana
增加 Kibana YUM Repository URL
echo "[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1" | tee /etc/yum.repos.d/kibana.repo
用 YUM 安裝 Kibana
yum install -y kibana
打開防火牆 5601 端口
firewall-cmd --permanent --add-port=5601/tcp
firewall-cmd --reload
設定 Kibana 為背景服務
systemctl daemon-reload
systemctl enable kibana.service
啟動 Kibana
systemctl start kibana.service
有一點要注意一下,Kibana 預設指定的 Elasticsearch 伺服器位址是在 http://localhost:9200,如果我們的 Elasticsearch 不是 host 在 http://localhost:9200,我們需要修改 elasticsearch.url
參數值,請參考下面設定步驟。
修改 /opt/kibana/config/kibana.yml 檔案,設定下列參數:
elasticsearch.url: "http://192.168.8.101:9200"
安裝成功之後,在瀏覽器輸入 http://[我們的 Kibana 伺服器]:5601
就會得到下面的畫面。
安裝 Logstash
接下來就是我們的重頭戲啦,Logstash 是整個 ELK 的靈魂,即使不用 Elasticsearch 及 Kibana,我們依然可以用 Logstash 自訂自己的輸入及輸出來收集日誌。
增加 Logstash YUM Repository URL
echo "[logstash-2.3]
name=Logstash repository for 2.3.x packages
baseurl=http://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1" | tee /etc/yum.repos.d/logstash.repo
用 YUM 安裝 Logstash
yum install -y logstash
設定 Logstash 為背景服務
systemctl daemon-reload
systemctl enable logstash.service
Logstash 的用法
Logstash 處理資料的方式就像 Pipeline 一樣:輸入資料 -> 過濾資料 -> 輸出資料
,整個概念就是這樣而已,要做一組「輸入資料 -> 過濾資料 -> 輸出資料」這樣的日誌收集程序,需要用 Logstash 獨特的語法去撰寫設定檔,為什麼說獨特呢?因為它的格式很像 JSON 又不是 JSON,很像 Rubydebug 又不是 Rubydebug,而且還可以在裡面寫邏輯運算,所以我說獨特。
「輸入資料 -> 過濾資料 -> 輸出資料」就是下面這三大區塊,所有的變化就都在這三大區塊裡面去組合。
input {
}
filter {
}
output {
}
寫入第一筆 Log
我這邊寫了一組設定檔,底下我有稍微寫一下說明,而這組設定檔我沒有用到 filter。
input {
stdin { }
}
output {
elasticsearch {
hosts => ["192.168.8.101"]
}
stdout { }
}
input
- stdin:接收畫面上的輸入。
output
- elasticsearch:輸出到 host 在 192.168.8.101 的 Elasticsearch。
- stdout:輸出到畫面上。
我們把設定儲存起來之後,給它一個檔名假設叫 stdin_to_elasticsearch.conf
,我們就可以執行下面的指令把 Logstash 叫起來。
/opt/logstash/bin/./logstash -f stdin_to_elasticsearch.conf
我們這邊是用 stdin 畫面輸入的方式讓 Logstash 接收 Log,因此我們在畫面上輸入一些訊息讓 Logstash 收走,這樣我們就成功地餵一筆 Log 給 Logstash,並且將 Log 儲存在 Elasticsearch 裡面。
用 Kibana 產生第一張統計圖
Kibana 裝起來之後我們還會看到它要我們建立一個 Index Pattern
,Logstash 預設會每天建立一個 Index 把當天的 Log 寫到當天的 Index 裡面,預設的 Index 命名方式就是 logstash-%{+YYYY.MM.dd}
,所以看到下面這個畫面也不要害怕,就按下 Create
就對了。
我們切換到 Discover
頁籤,就可以看到我們剛剛塞進去的 Log。
接著我們切換到 Visualize
頁籤,選擇我們要產生的統計圖表類型之後,這邊預設 Y 軸是 Log 的數量,我們還必須指定 X 軸的維度欄位。
最後按下 Apply changes
統計圖表就會出來。
關於 ELK 的應用重點在於 Logstash 的設定以及 Kibana 報表的展示,官方提供很多有關於 Logstash 及 Kibana 的資源,光 Logstash 的 Input Plugins 及 Ouput Plugins 就嚇死人得多,之後有機會的話我還會把我在 ELK 上的應用場景 post 上來。