前言:
ELK Stack 是 Elasticsearch、Logstash、Kibana 三個開源軟件的組合。ELK Stac可以用於實時日誌處理,數據分析等領域,目前瞭解該領域應該是開源界的第一選擇。實踐中,可跟對具體使用場景選擇不同的軟件組合,如下是快速安裝部署,同樣也適合生產環境。
實踐環境
名稱 | 版本 | 備註 |
OS | centos6.4以上 | 7.x未測試,5.x不適用 |
Elasticsearch | 2.4.0以上 | 適用JDK8.x,採用最新穩定版 |
Logstash | 2.4.0以上 | 同上 |
Kibana | 4.6.1以上 | 同上 |
各種包的資源準備好,可以去官網下載(www.elasticsearch.co),或者去國內的大型源裏面,比如阿里源,清華源等等,這裏就不詳細說明了
由於這裏下載的都是rpm包,安裝很簡單,JDK的安裝配置也不說明了,這個大家應該都沒什麼問題了
安裝配置elasticsearch
rpm -ivh ela*.rpm
安裝插件
/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
添加系統服務並啓動
chkconfig --add elasticsearch && /etc/inin.d/elasticsearch start
修改一下配置文件中的network參數,可以讓其綁定在每個網卡設備上
測試
#自定義配置文件(/etc/elasticsearch/elasticsearch.yml)
#組播組播自動發現配置
cluster.name: my-test (集羣名稱,組播自動發現)
node.name: node-01
node.master: true
node.data:true
index.number_of_shards: 5 (默認分片數)
index.number_of_replicas: 1 (默認分片副本)
path.conf:/path/to/conf (配置文件目錄)
path.data:/usr/local/ver01/elasticsearch/data (數據存儲目錄)
path.work:/ (臨時文件目錄)
path.logs:/usr/local/ver01/elasticsearch/logs (日誌文件目錄)
path.plugins:/ (插件目錄)
bootstrap.mlockall:true (鎖住內存,不交換內存數據到swap上)
network.host:0.0.0.0
#集羣單播配置
cluster.name: mytest
node.name: "node-01"
node.data: true
bootstrap.mlockall: true
network.host: 172.16.200.108
network.publish_host: 172.16.200.108
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["172.16.200.108","172.16.200.109"]
安裝logstach
rpm -ivh log*.rpm
相關配置文件,管理腳本
#logstash配置文件默認存放目錄
/etc/logstash/conf.d
#logstash bin文件
/opt/logstash/bin/logstash
#logstash管理腳本
/etc/init.d/logstash start #start/stop/restart
#測試配置文件
/opt/logstash/bin/logstash agent -f /etc/logstash/conf.d/logstash.conf -t
一個簡單收集Nginx訪問日誌的配置文件
input {
file {
type => "nginx-messages"
path => ["/home/wwwlogs/access.log"]
start_position => "beginning"
}
}
output {
if [type] == "nginx-messages" {
elasticsearch {
hosts => ["172.16.200.108:9200"]
index => "nginx-messages-%{+YYYY-MM}"
}
}
}
安裝kibana
rpm -ivh kibana*.rpm
相關配置
#修改配置文件指定elasticsearch服務器地址:例如
vim /opt/kibana/config/kibana.yml
elasticsearch.url: "http://172.16.200.108:9200"
server.host: "172.16.200.108"
#啓動
/etc/init.d/kibana start
#默認訪問地址:http://172.16.200.108:5601
### 注意以上用rpm包安裝的配置文件,數據目錄的默認配置,需要請修改 ###
安裝配置無誤的話,可以登錄http://172.16.200.108:5601訪問玩一下了
針對目前elk中前端展現的kiabna來說,權限的劃分對企業用戶使用非常不方便,雖然可以簡單的方法加上基本密碼認證(HTTP Auth Basic),但是要細分權限就有點坑了。kibana優勢不用說,展現及統計都十分強大,所以兩者各有千秋,本次主題所說的grafana替換kibana只是部分替換。我們這裏2兩者可以並用,將grafana提供給運營及開發等人羣查看,給予相關分組及查看權限,而對於運維或者數據挖掘等等真正對這些日誌進行的分析我們可以使用kibana。實踐如下:
依然選擇單機操作,所有的安裝均在172.16.200.108上
安裝grafana(2.6.0)
yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0-1.x86_64.rpm
配置文件
/etc/grafana/grafana.ini
#默認數據庫sqlite3,默認服務端口3000,等等
啓動腳本
/etc/init.d/grafana-server
添加Elasticsearch數據源
* 登錄成功後,Data Sources => Add new
關鍵說明:
Type : 選擇elasticsearch類型
url : elasticsearch 的地址
access : proxy 本實例選用該選項
index name : elasticsearch中存儲數據的的索引名
如下所示:添加完成後可 Test connection 測試,如果如下圖所示則數據源可正常獲取數據
創建一個日誌相關統計的圖形
默認的組織,選擇 New ,添加一個dashboard(如下圖),我們這裏簡單翻譯爲儀表盤。儀表盤中可以自定義自己需要的相關信息.
創建的新儀表盤會看到一個綠色的條,點擊可以做相關動作,另外設置裏面可以另存爲一個具體的名字保持儀表盤.如下:
綠色條展開後有許多選項,如下:
我們點擊上面的Graph創建一個圖形,然後如下,做相關參數調整
General => Title 定義圖形名稱,如下:
Metrics => Query 可以輸入相關查詢條件(lunece 語法),右下角的nginx紅框代表當前數據源是之前定義的數據源名稱
Axes & Grid => Legend 是否顯示,及顯示的位置
Axes & Grid => Values 對應是否顯示相關值,如下:
創建一個可查看相關詳細日誌的表格
我們點擊綠色條,然後”Add Pannel”=>”Table”,然後如下,做相關參數調整,如下:
grafana相關用戶及權限功能展示
grafana用戶的功能是比較豐富的,這裏簡單展示下,可仔細查看下/etc/grafana/grafana.ini 配置文件中更多對用戶這塊的控制與定製.
kibana地圖顯示
思路
這裏用最簡單的思路實現,如下(nginx中client IP):
logstash
input:通過制定文件採集(這裏採集的nginx源日誌已經設置爲json格式了)
filter:通過geoip插件指定字段client
output:把日誌導出到elasticsearch(這裏重點注意,index名字如果在你沒指定自定義模板之前,必須用”logstash-“開頭,不理解沒關係,按照我的例子操作一遍先實現即可)kibana
先在Settings中創建好對應的index
然後在Discover中查看對應index是否有採集到相關數據,數據採集是否正確
再就是Visualize中Title map功能就可以查看相關client IP在地圖中的顯示及訪問統計
實踐
logstash配置文件
input {
file {
type => "nginx-access"
path => ["/logs/nginx/access.log"]
}
}
filter {
json {
source => "message"
}
geoip {
source => "client"
}
}
output {
elasticsearch {
hosts => ["10.154.19.58:9200"]
index => "logstash-nginx-access-%{+YYYY.MM}"
}
}
kibana操作
先在Settings中創建好對應的index
然後在Discover中查看對應index是否有採集到相關數據,數據採集是否正確
再就是Visualize中Title map功能就可以查看相關client IP在地圖中的顯示及訪問統計
日誌統計分析--filebeat
Filebeat 是elastic官方Beats系列之一,用來採集文件日誌推薦實踐工具。採用當前流行高效率go語言開發,客戶端採集日誌無需安裝jdk。
filebeat+logstash+elasticsearch+kibana
看下官網的示意圖,圖中我們暫時只使用Beats家族之一filebeat
filebeat:客戶端採集文件日誌信息,然後output給logstash,這裏可以做負載
logstash:通過beat插件收集filebeat發過來的日誌,如果需要可以過濾一些規則,然後indexer到elasticsearch
elasticsearch:保存及搜索日誌
kibana:前端交互及展現
相關安裝說明
1:安裝filebeat、curl -L -O https://download.elastic.co/beats/filebeat/filebeat-1.1.1-x86_64.rpm
sudo rpm -vi filebeat-1.1.1-x86_64.rpm
2:安裝logstash
參照上面的安裝
3:安裝logstash-input-beats插件
/opt/logstash/bin/plugin install logstash-input-beats
配置實例
filebeat:(/etc/filebeat/filebeat.yml)
這裏收集3種文件日誌,定義了三種文檔類型,方便在logstash索引時根據不同文檔應用不通過濾規則
其中nginx-access日誌源是json格式
output 可以啓用負載均衡
shipper 可以定義name tags等等
filebeat:
prospectors:
-
document_type: "messages"
paths:
- /var/log/messages
-
document_type: "php-error-5"
paths:
- /home/wwwroot/php_error/php.log
-
document_type: "nginx-access"
scan_frequency: "10s"
backoff: "1s"
paths:
- "/usr/local/ver01/nginx/logs/*json.log"
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["172.31.27.253:5044","172.31.17.40:5044"]
worker: 4
compression_level: 3
loadbalance: true
shipper:
name: test-web-01
tags: ["web-server", "nginx"]
啓動filebeat
/etc/init.d/filebeat start
logstash:(/etc/logstash/conf.d/index.conf)
index.conf文件名可自取,以.conf後綴結尾即可
filter 過濾了nginx-access 這種json格式日誌,並加入了geoip插件將其客戶端IP生成詳細的ip位置信息
filter 過濾了php-error-5 phperror日誌,並切分好字段
output 根據不通類型文檔輸入到不同的es索引中
input {
beats {
port => 5044
}
}
filter {
if [type] == "nginx-access" {
json {
source => "message"
}
mutate {
remove_field => [ "message" ]
}
geoip {
source => "client"
}
}
if [type] == "php-error-5" {
grok {
break_on_match => false
match => [ "message", [
"\[%{MONTHDAY:day}-%{MONTH:month}-%{YEAR:year} %{TIME:time}\] PHP %{DATA:level}\: %{GREEDYDATA:error}"
]
]
add_field => { "timestamp" => "%{day}-%{month}-%{year} %{time}" }
remove_field => [ "day", "month", "year", "time" ]
}
date {
match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss" ]
}
mutate {
remove_field => [ "tags", "offset", "timestamp" ]
}
}
}
output {
if [type] == "messages" {
elasticsearch {
hosts => ["10.154.19.58:9200"]
index => "logstash-messages-%{+YYYY.MM}"
}
}
if [type] == "nginx-access" {
elasticsearch {
hosts => ["10.154.19.58:9200"]
index => "logstash-nginx-access-%{+YYYY.MM}"
}
}
if [type] == "php-error-5" {
elasticsearch {
hosts => ["10.154.19.58:9200"]
index => "logstash-php-error-%{+YYYY.MM}"
}
}
#stdout { codec => rubydebug }
}
測試配置文件:
/opt/logstash/bin/logstash agent -f /etc/logstash/conf.d/index.conf -t
啓動logstach:
/etc/init.d/logstash start