ELK 日誌監控平臺環境搭建及使用說明
1. ELK概述
ELK,也就是Elasticsearch、Logstash、Kibana三者的結合,是一套開源的分散式日誌管理方案.
Elasticsearch:負責日誌儲存、檢索和分析
LogStash:負責日誌的收集、處理
Kibana:負責日誌的視覺化
方案:
2. 環境搭建
為整體環境建立一個合適的目錄,mkdir $project_path/ELK
, project_path 根據情況而定,例如”/usr/local”。
2.1 安裝依賴
logstash和elasticsearch均依賴java,所以安裝這兩個之前,我們應該先安裝好java,版本 > java7. java的安裝這裡不做贅述。
2.2 logstash
2.2.1 基礎安裝配置
首先,去Elastic官網下載對應平臺安裝檔案,可下載的檔案型別有zip、rpm、deb、tgz等,個人建議直接下載zip包,解壓即用,方便。
解壓之後,進入logstash目錄,建立”conf”目錄,編寫配置檔案。下面以收集分析nginx access 日誌為例。
input {
file {
path => ["/usr/local/nginx/logs/lazyapi_access.log"]
}
}
filter {
grok {
patterns_dir => "../patterns"
match => {
"message" => "%{NGINXACCESS}"
}
}
date {
match => ["time_local", "dd/MMM/YYYY:HH:mm:ss Z"]
}
}
output {
elasticsearch {
hosts => ["10.16.59.99:9200"]
index => "logstash-nginx-%{+YYYY.MM.dd}"
workers => 1
flush_size => 1
idle_flush_time => 1
template_overwrite => true
}
stdout{codec => rubydebug}
}
配置檔案分為三個部分:input,filter,output。三部分檔案寫,也可寫一塊
input
定義輸入,file為輸入的檔案,可以有多個。出file外,還有stdin、TCP、syslog、collectd等。filter
過濾配置,可以將日誌整理成自己想要的格式。logstash有豐富的過濾外掛,date處理、grop正則捕獲、GeoIP、JSON編碼、key-value切分等等。
grok是logstash最重要的外掛,在grok中定義好正在表示式,可以在其他地方引用它。語法這裡不過多介紹,需要可以自己從網上學習。這裡我們要抓取Nginx日誌,需要根據Nginx的日誌格式寫一個過濾的正則表示式,將其儲存在”.logstash/patterns/nginx”檔案中,內容如下:
NGINXACCESS %{IP:remote_addr} - - \[%{HTTPDATE:time_local}\] \"%{WORD:http_method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:status:int} %{NUMBER:body_bytes_sent:int} (?:\"(?:%{URI:http_referer}|-)\"|%{QS:http_referer}) \"%{GREEDYDATA:agent}\" %{HOSTNAME:http_host} %{NUMBER:request_length:int} %{NUMBER:request_time:float} %{NUMBER:upstream_response_time:float}
注意: 此處的正則表示式要和nginx的日誌格式相對應,否則會匹配失敗,無法將nginx日誌離散取值。
nginx 日誌格式例子:
log_format combinedio '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $http_host $request_length $request_time $upstream_response_time';
output
logstash的輸出也有多種,標準輸出,輸出到elasticsearch,redis等等, 可以同時指定多個輸出,stdout方便除錯,檢視實時的日誌。
輸出到es說明:hosts 為es的ip和埠;index為索引名稱,按日期分方便管理;執行logstsh:
./bin/logstash -f conf/logstash-nginx.conf
選項”-f”是logstahsh的配置檔案,如果有多個配置檔案,也可以是一個目錄。
%{NUMBER:status:int} 將status欄位設為整型,
%{NUMBER:request_time:float} 將Request_time設為float型別,[重要],方便kibana計算視覺化
logstash 2.2.2 分角色部署
將logstash按功能分成三個角色:shipper、broker和indexer。每個角色使用不同的logstash配置。
- shipper角色(日誌收集)
input部分配置要收集的日誌檔案或原始日誌來源
filter部分可以用grok過濾日誌
output部分將格式化的日誌輸出到broker角色中(此處以redis為例,作為緩衝訊息佇列)
- broker角色(訊息佇列)
需要為此角色啟動一個redis服務,可以去redis官網進行下載,然後編譯安裝,這裡不再做詳細介紹。
啟動服務時,先修改或新建一個redis配置檔案(如,redis.conf), 安全起見,配置下埠和密碼,其他的可使用預設配置。
./redis-server /path/to/redis.conf
- indexer角色
功能:從redis中取出日誌,然後儲存到elasticsearch叢集中。
提示:為提高資料的寫入效率,可以根據機器硬體因素適當提高threads和works的數量,也可以多設定幾個indexer角色,同時執行。
2.3 elasticsearch部署
2.3.1 下載
首先下載es檔案,和logstash類似,這裡直接下載zip檔案
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.4.1/elasticsearch-2.4.1.zip
unzip elasticsearch-2.4.1.zip
2.3.2 配置es
主要是配置elasticsearch.yml檔案,主要有network,node,path,memory等幾個方面,單機模式下主要配置network,其他採用預設即可。
\# ---------------------------------- Network -----------------------------------
\# Set the bind address to a specific IP (IPv4 or IPv6):
network.host: 10.16.59.99
\# Set a custom port for HTTP:
http.port: 9200
2.3.3 執行elasticsearch
./bin/./bin/elasticsearch
2.3.4 elasticsearch 叢集部署
在日誌量比較大時候,單機模式滿足我們的需求,這時候可以選擇將elasticsearch叢集化部署。
通過配置elasticsearch.yml檔案,配置各個節點。es2.4的版本是可以自動發現節點的,可以將節點的ip(多個或其中一個)放在discovery.zen.ping.unicast.hosts中即可。 下面是一個節點配置的例子:
\# ======================== Elasticsearch Configuration =========================
\# Use a descriptive name for your cluster:
cluster.name: es_log_monitor
\# ------------------------------------ Node ------------------------------------
\# Use a descriptive name for the node:
node.name: node-es1
bootstrap.memory_lock: true
network.host: 10.16.59.99
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.16.59.112"]
#node.master: true
#node.data: false
“node.master”和”node.data”可以選擇性配置
- master為true,data為false:節點不儲存資料,作為協調者
- master為false,data為true:節點作為資料儲存節點,不會被選為master節點
- master為false,data為false:均衡負載
- 預設都為true
使用以下命令檢視節點的狀態:
curl 10.16.59.99:9200/_cat/nodes?v
2.3.5 使用head外掛管理和檢視叢集狀態
安裝head外掛,進入elasticsearch目錄下,執行如下命令:
./bin/plugin install mobz/elasticsearch-head
安裝之後可以便可通過流量器進行訪問了,注意是否需要設定防火牆,也可以配置nginx 反向代理通過80埠訪問。
2.4 kibana部署
2.4.1 下載解壓kibana檔案
2.4.2 配置kibana.yml檔案
開啟kibana.yml檔案,主要修改以下三個點(找到對應的地方修改):
server.port: 5601 #kibana 服務埠
server.host: "127.0.0.1" #服務繫結的地址
elasticsearch.url: "http://10.16.59.99:9200" #es服務地址
2.4.3 執行kibana
./bin/kibana
執行以後可通過瀏覽器用地址加埠開啟kibana的視覺化頁面。(網路開放情況下)
2.4.4 為kibana服務配置反向代理(非必須)
有些情況下,很多伺服器只開發80,443等少量常用埠,這時候如果還想通過80埠訪問,需要配置反向代理,這裡以nginx為例。
在nginx的配置目錄中(include),新增”kibana_proxy.conf”檔案,內容如下:
server {
listen 80;
server_name kibana.xxx.xxx.cn;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5601$request_uri;
allow all;
}
}
將此檔案包含到nginx.conf中
“`
http {
include mime.types;
default_type application/octet-stream;
... ...
... ...
include include/*.conf;
}
“`
如果已包含include目錄,則直接重新載入nginx
$nginx_path/sbin/nginx -s reload
3. kibana使用簡單說明
3.1 設定index
首次訪問kibana的時候,會被要求定義一個index pattern用來匹配一個或者多個索引名。之後還可以從頂部導航欄中的“settings”新增更多的index pattern。通過瀏覽器訪問kibana介面,初次使用跳轉到如下介面:
我們可以指定一個或者匹配多個elasticsearch所以的index pattern。萬用字元”*”匹配索引名中0到多個字元。選擇一個包含時間戳的索引欄位可以用來做基於時間處理。新索引中帶有時間戳,定期生成,再選擇”Use event times to create index names”選項,然後選擇”Index pattern interval”可以提高搜尋效能。
3.2 Discover查詢資料
進入kibana的Discover,在這裡可以提交搜尋請求,過濾搜尋結果,返回檢索資料。Discover屬於互動式查詢資料,我們可以看到匹配搜尋請求的文件總數,獲取欄位值得統計情況。
- 時間過濾器
在介面的右上角有個時間過濾器的設定,預設值為最近15分鐘,它將搜尋結果限定在特定的時間範圍內。開啟時間過濾器,有三種方式可供選擇,一是快速選擇一個時間段(今天,這周,最近15分鐘,最近半小時,最近1小時等等); 二是相對時間選擇,可以選擇自多長時間到現在;三是絕對時間選擇,自主選擇時間段的資料。
- 搜尋資料
支援的語法:Lucene 查詢語法和基於JSON的query DSL。主要操作步驟點:
a) 簡單文字搜尋,直接輸入文字字串。
b) 搜尋特定欄位值,在值前面加上欄位的值。例如,“status:200”將會顯示所有status欄位為200的內容。
c) 搜尋一個值的範圍,使用範圍查詢語法, [Start_value TO End_value], 例如要查詢4xx的狀態碼,可以輸入”status:[400 TO 499]”.
d) 更復雜的搜尋,可以使用and,or和not。
- 新建查詢、儲存查詢、載入已儲存的查詢
3.3 視覺化功能
Visualize標籤用來設計視覺化,可以儲存視覺化的結果拱以後使用,載入合併到儀表盤裡。介面如下圖所示。
視覺化功能基於以下幾種資料來源型別:
- 新的互動式查詢
- 已儲存的查詢
- 已儲存的視覺化
視覺化操作編輯器。
視覺化編輯器用來配置編輯視覺化檢視,如下圖所示:
- 工具欄
工具欄有互動式搜尋框,可儲存載入視覺化,重新整理視覺化資料。
- 聚合構建器(Aggregation Builder)
左側有metric和bucket聚合。bucket效果類似於sql group by語句。想進一步瞭解聚合,可以閱讀elasticsearch aggregation reference.
在柱狀圖或折線圖中,metrics做Y軸,buckets做X軸,餅圖裡metrics做分片大小,buckets做分片數量。
3.4 儀表盤
Kibana中dashboard能夠自由排列已儲存的視覺化,還可以儲存、過載和分享當前的儀表盤。儀表盤主要操作有以下幾方面:
工具欄上
- 建立一個新的儀表盤
首次進入dashboard,Kibana顯示一個空白儀表盤,可以通過新增視覺化檢視構建儀表盤。 - 新增視覺化到儀表盤
點選右側的“+”號按鈕,從Visualize容器中選擇合適的視覺化放入儀表盤中,可以通過拖拽調整檢視的位置和大小。 - 儲存和載入儀表盤
- 建立一個新的儀表盤
容器
可進行的操作有移動容器、改變容器大小、刪除容器、檢視容器詳細資訊。
還可以修改視覺化,即對視覺化檢視進行編輯。