1. 程式人生 > >ELK入門與簡單應用

ELK入門與簡單應用

ELK簡單應用

1. ELK概述

ELK,也就是Elasticsearch、Logstash、Kibana三者的結合,是一套開源的分布式日誌管理方案.

更多詳情,請見https://github.com/jeanphorn/elk-stack

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包,解壓即用,方便。

wget https://download.elastic.co/logstash/logstash/logstash-all-plugins-2.4.0.zip

unzip logstash-all-plugins-2.4.0.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}
}1234567891011121314151617181920212223242526272829

配置文件分為三個部分: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}
    • 1

    • 2


註意: 此處的正則表達式要和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';123

  • 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.zip123

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: 9200123456789101112

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: false123456789101112131415161718192021

“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文件

wget https://download.elastic.co/kibana/kibana/kibana-4.6.1-linux-x86_64.tar.gz

tar -zxvf kibana-4.6.1-linux-x86_64.tar.gz -C ./

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服務地址123

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;
    }
}123456789101112

將此文件包含到nginx.conf中

“`
http {
include mime.types;
default_type application/octet-stream;

... ...
... ...

include include/*.conf;12345

}

“`
如果已包含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能夠自由排列已保存的可視化,還可以保存、重載和分享當前的儀表盤。儀表盤主要操作有以下幾方面:

  1. 工具欄上

    • 創建一個新的儀表盤
      首次進入dashboard,Kibana顯示一個空白儀表盤,可以通過添加可視化視圖構建儀表盤。

    • 添加可視化到儀表盤
      點擊右側的“+”號按鈕,從Visualize容器中選擇合適的可視化放入儀表盤中,可以通過拖拽調整視圖的位置和大小。

    • 保存和加載儀表盤

  2. 容器

可進行的操作有移動容器、改變容器大小、刪除容器、查看容器詳細信息。

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

技術分享圖片


4. 參考資料

[1]. https://www.elastic.co
[2]. 《ELK stack權威指南》
[3]. https://discuss.elastic.co/t/nginx-log-filter-problem/46744
[4]. http://grokdebug.herokuapp.com/
[5]. https://chenjiehua.me/linux/elk-log-system-setup.html


ELK入門與簡單應用