1. 程式人生 > >ELK 日誌監控平臺環境搭建及使用說明

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

es command

2.3.5 使用head外掛管理和檢視叢集狀態

安裝head外掛,進入elasticsearch目錄下,執行如下命令:

./bin/plugin install mobz/elasticsearch-head

安裝之後可以便可通過流量器進行訪問了,注意是否需要設定防火牆,也可以配置nginx 反向代理通過80埠訪問。

es head

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介面,初次使用跳轉到如下介面:

home index

我們可以指定一個或者匹配多個elasticsearch所以的index pattern。萬用字元”*”匹配索引名中0到多個字元。選擇一個包含時間戳的索引欄位可以用來做基於時間處理。新索引中帶有時間戳,定期生成,再選擇”Use event times to create index names”選項,然後選擇”Index pattern interval”可以提高搜尋效能。

3.2 Discover查詢資料

進入kibana的Discover,在這裡可以提交搜尋請求,過濾搜尋結果,返回檢索資料。Discover屬於互動式查詢資料,我們可以看到匹配搜尋請求的文件總數,獲取欄位值得統計情況。

discover

  • 時間過濾器

在介面的右上角有個時間過濾器的設定,預設值為最近15分鐘,它將搜尋結果限定在特定的時間範圍內。開啟時間過濾器,有三種方式可供選擇,一是快速選擇一個時間段(今天,這周,最近15分鐘,最近半小時,最近1小時等等); 二是相對時間選擇,可以選擇自多長時間到現在;三是絕對時間選擇,自主選擇時間段的資料。

time filter

  • 搜尋資料

支援的語法: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標籤用來設計視覺化,可以儲存視覺化的結果拱以後使用,載入合併到儀表盤裡。介面如下圖所示。

create

視覺化功能基於以下幾種資料來源型別:

  • 新的互動式查詢
  • 已儲存的查詢
  • 已儲存的視覺化

視覺化操作編輯器。

視覺化編輯器用來配置編輯視覺化檢視,如下圖所示:

visual edit

  • 工具欄

工具欄有互動式搜尋框,可儲存載入視覺化,重新整理視覺化資料。

  • 聚合構建器(Aggregation Builder)

左側有metric和bucket聚合。bucket效果類似於sql group by語句。想進一步瞭解聚合,可以閱讀elasticsearch aggregation reference.

在柱狀圖或折線圖中,metrics做Y軸,buckets做X軸,餅圖裡metrics做分片大小,buckets做分片數量。

3.4 儀表盤

Kibana中dashboard能夠自由排列已儲存的視覺化,還可以儲存、過載和分享當前的儀表盤。儀表盤主要操作有以下幾方面:

  1. 工具欄上

    • 建立一個新的儀表盤
      首次進入dashboard,Kibana顯示一個空白儀表盤,可以通過新增視覺化檢視構建儀表盤。
    • 新增視覺化到儀表盤
      點選右側的“+”號按鈕,從Visualize容器中選擇合適的視覺化放入儀表盤中,可以通過拖拽調整檢視的位置和大小。
    • 儲存和載入儀表盤
  2. 容器

可進行的操作有移動容器、改變容器大小、刪除容器、檢視容器詳細資訊。

還可以修改視覺化,即對視覺化檢視進行編輯。

dash board

4. 參考資料