ELK實時日誌分析平臺的搭建部署及使用

1、 ELK初步接觸

1.1 爲何要用ELK

日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。
一般,日誌被分散的儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的syslog,將全部服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。java

  • Elasticsearch是個開源分佈式搜索引擎,它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
  • Logstash是一個徹底開源的工具,他能夠對你的日誌進行收集、過濾,並將其存儲供之後使用(如,搜索)。
  • Kibana 也是一個開源和免費的工具,它Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。
     ELK架構圖

ELK架構圖node

Elasticsearch下載地址:https://www.elastic.co/downlo...(目前最新版本:5.4.3)
Logstash下載地址:https://www.elastic.co/downlo...(目前最新版本:5.4.3)
Kibana下載地址:https://www.elastic.co/downlo...(目前最新版本:5.4.3)linux

1.2 Java 8

elasticsearch 推薦使用java8,因此先安裝好java8。nginx

1.3 Elasticsearch

elasticsearch的安全機制不容許用root用戶啓動,故新建用戶elk:elk。
以elk用戶啓動elasticsearch:
$ su - elk
$ elasticsearch-5.4.3/bin/elasticsearch &
安裝結束後:curl localhost:9200 返回以下內容表示安裝成功。git

{
  "name" : "aQgGH94",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "BjFsa-KxQdSnP58Enrr6NA",
  "version" : {
     "number" : "5.4.3",
    "build_hash" : "eed30a8",
    "build_date" : "2017-06-22T00:34:03.743Z",
    " build_snapshot" : false,
    "lucene_version" : "6.5.1"
  },
  "tagline" : "You Know, for Search"
}

安裝過程當中可能會出現的問題及解決:Solutionsgithub

1.4 Kibana

修改配置文件kibana-5.4.3-linux-x86_64/config/kibana.yml:json

The Elasticsearch instance to use for all your queries.

elasticsearch.url: "http://localhost:9200"
執行:
$ su – elk
$ ./kibana數組

1.5 Nginx

前面kibana只能採用localhost訪問,這裏利用反向代理使其餘機器能夠訪問,本文利用nginx來達到這一目的。
修改配置文件nginx/nginx.conf:
將默認的server{}這一段去掉,添加:include conf.d/*.conf;
$ vi nginx/conf.d/kibana.conf瀏覽器

server {
               listen 80;

            server_name bogon;     #機器的hostname
#    auth_basic "Restricted Access";
#    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;     #範文kibana的地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

$ ./nginx/sbin/nginx #啓動nginx安全

1.6 Logstash

 Enter your image description here:
其實它就是一個收集器而已,咱們須要爲它指定Input和Output(固然Input和Output能夠爲多個)。

新建索引配置文件
$ cd logstash-5.4.3/bin
$ mkdir conf
$ vi conf/logstash-indexer.conf

input {
 file {
    path => ["/var/opt/log/a.log","/var/opt/log/b.log"]

  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

上面幾個步驟的意思就是建立一個名爲logstash-indexer.conf的配置文件,input{file{...}}部分指定的是日誌文件的位置(能夠多個文件),通常來講就是應用程序log4j輸出的日誌文件。output部分則是表示將日誌文件的內容保存到elasticsearch,這裏hosts對應的是一個數組,能夠設置多個elasticsearch主機,至關於一份日誌文件的內容,能夠保存到多個elasticsearch中。stdout,則表示終端的標準輸出,方便部署時驗證是否正常運行,驗證經過後,能夠去掉。
$ ./logstash -f conf/logstash-indexer.conf #啓動logstash

稍等片刻,若是看到Logstash startup completed,則表示啓動成功。而後另開一個終端窗口,隨便找個文本編輯工具(好比:vi),向/var/opt/log/a.log裏寫點東西,好比:hello world之類,而後保存。觀察logstash的終端運行窗口,是否有東西輸出,若是有如下相似輸出:

{
    "path" => "/var/opt/log/a.log",
    "@timestamp" => 2017-07-09T03:17:28.001Z,
      "@version" => "1",
    "host" => "bogon",
       "message" => "hello word"
 }

在瀏覽器中輸入http://192.168.1.139, 即會跳轉至kibana頁面,首次運行,會提示建立index,直接點擊Create按鈕便可。

 Enter your image description here:

2、 應用場景示例

2.1 收集多個服務器的日誌

在客戶服務器安裝Filebeat,將日誌發送給logstash。
 Enter your image description here:
圖解

2.1.1 生成SSL認證

由於要使用Filebeat將日誌從客戶端發送到ELK,因此須要建立SSL認證和祕鑰對。Filebeat會使用該認證來識別ELK。有兩種方法來生成SSL認證。若是已經有DNS設置,便可以使客戶端識別ELK服務端的IP地址,使用第二種方法,不然使用第一種方法。
第一種方法:IP地址
若是沒有DNS設置(DNS的設置可讓產生日誌的客戶端服務器來識別ELK服務器的IP地址),必須將ELK服務器的IP地址添加到SSL認證的subjectAltName(SAN)域中。
$ vi /etc/pki/tls/openssl.cnf #編輯OpenSSl的配置文件
找到[ v3_ca ]段,在其下加入subjectAltName = IP: ELK_server_private_ip(ELK_server_private_ip爲ELK的IP地址)

利用如下命令來生成SSL認證以及私鑰
$ cd /etc/pki/tls #在/etc/pki/tls/目錄下
$ openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout
private/logstash-forwarder.key -out certs/logstash-forwarder.crt
生成的logstash-forwarder.crt文件將被拷貝到全部發送日誌給logstash的服務器上。

第二種方法:FQDN (DNS)
直接利用如下命令來生成SSL認證以及私鑰(在/etc/pki/tls/目錄下)(ELK_server_fqdn:ELK服務器的FQDN)
$ cd /etc/pki/tls
$ openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

2.1.2 配置logstash

Logstash的配置文件採用json的格式,配置文件包括三個部分:inputs,filters,outputs。
$ vi bin/conf/02-beats-input.conf

input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
`list text here`}

描述一個beats輸入,監聽tcp端口5044,而且會利用前面建立的ssl認證即祕鑰

$ vi bin/conf/10-syslog-filter.conf

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} % {SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

對syslog類型(Filebeat進行標記)的日誌進行過濾,並利用grok將輸入的syslog日誌解析
以使之結構化而且利於查詢。

$ vi bin/conf/30-elasticsearch-output.conf

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    sniffing => true
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

將beats數據存儲到elasticsearch(localhost:9200)並設置了index和type
若是要爲其餘使用Filebeats輸入的應用添加filter,請確保將這些文件正確命名,以使該文件的順序位於input和output文件之間(好比在02-和30-之間)

2.1.3 加載kibana儀表盤

elastic提供了一些kibana儀表盤和Beats索引模式的樣例,雖然本文不會使用這些儀表盤,可是仍是會加載這些儀表盤,由於咱們可使用它們包含的Filebeat索引模式。
下載儀表盤樣例文件:
$ curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
$ yum -y install unzip #安裝unzip
$ unzip beats-dashboards-*.zip
$ cd beats-dashboards-*
$./load.sh #加載儀表盤樣例

剛剛加載了以下索引模式:
[packetbeat-]YYYY.MM.DD
[topbeat-]YYYY.MM.DD
[filebeat-]YYYY.MM.DD
[winlogbeat-]YYYY.MM.DD
當使用kibana的時候,將選擇Filebeat索引模式做爲默認。

2.1.4 加載Filebeat索引模板

由於打算使用FIlebeats來將日誌送至elasticsearch,應該加載Filebeat索引模板。這個索引模板將會配置elasticsearch以機智的方式來分析送進來的Filebeat字段。
$ curl -O
https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json #下載Filebeat索引模板
`$ curl -XPUT 'http://localhost:9200/_templa...' -d@filebeat-index-template.json #加載此模板
`
如今ELK服務器已經準備好接受Filebeat數據。

2.1.5 在Client主機上安裝FileBeat軟件包

複製SSL認證
在ELK服務器上,拷貝以前建立的SSL證書到客戶端服務器上。
$ scp /etc/pki/tls/certs/logstash-forwarder.crt
user@client_server_private_address:/tmp
在客戶機上:
$ mkdir -p /etc/pki/tls/certs
$ cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

安裝Filebeat包
準備好filebeat-5.5.0-linux-x86_64.tar.gz

配置Filebeat
配置Filebeat來鏈接到Logstash
在客戶服務器上:
$ vi filebeat/filebeat.yml

filebeat:
  prospectors:  #定義了哪些日誌文件能夠被傳送給Logstash,而且該如何處理它們
      -         #表示開始定義prospector
      paths:
        - /var/log/secure   #表示傳送secure和messages日誌
        - /var/log/messages
      #  - /var/log/*.log
      
      input_type: log
      
      document_type: syslog #傳送的日誌類型爲syslog,其也是Logstash過濾器配置的

  registry_file: /var/lib/filebeat/registry

output:
  logstash:
    hosts: ["elk_server_private_ip:5044"]  #ELK服務器的IP,發送至Loastash
    bulk_max_size: 1024

tls:
# List of root certificates for HTTPS server verifications
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

shipper:

logging:
  files:
    rotateeverybytes: 10485760 # = 10MB

注意,Filebeat的配置文件是YAML格式的,因此空格數是很重要的。

如今Filebeat就會發送客戶服務器上的syslog messages and secure文件到ELK服務器!其餘的客戶端服務器同樣配置。

2.2 kibana案例數據

這裏直接將數據導入elasticsearch,即假設數據源的數據已經存儲到elasticsearch中,而後利用kibana來對數據進行可視化。
導入如下三種數據:

  1. 莎士比亞的全部著做,合適地解析成了各個字段:shakespeare.json。
  2. 隨機生成的虛構帳號數據:accounts.json
  3. 隨機生成的日誌文件:logs.jsonl

shakespear.json的數據格式以下:

{
        "line_id": INT,
        "play_name": "String",
        "speech_number": INT,
        "line_number": "String",
        "speaker": "String",
        "text_entry": "String",
        }

accounts.json的數據格式以下:

{
        "account_number": INT,
        "balance": INT,
        "firstname": "String",
        "lastname": "String",
        "age": INT,
        "gender": "M or F",
        "address": "String",
        "employer": "String",
        "email": "String",
        "city": "String",
        "state": "String"
        }

logs.jsonl的主要數據格式以下:

{
        "memory": INT,
        "geo.coordinates": "geo_point"
        "@timestamp": "date"
        }

在kibana界面創建三個索引模式,分別對應剛剛導入es的索引:
logstash-2015.05* -> logs.jsonl
bank* -> account.json
shakes* -> shakespear
而後利用kibana的visualize功能可定製以下圖表展現:
 Enter your image description here:
圖 帳戶落在不一樣薪水範圍的比率,最外圈表示按薪水全部者的年齡拆分
 Enter your image description here:
圖每一個劇臺前幕後的數量
 Enter your image description here:
圖可視化一些地理數據

本文原創首發於 Cobub官網博客 ,做者:李紅兵
若有轉載請註明做者和出處!

推薦一款開源私有化部署的移動應用數據統計分析系統 Cobub Razor
項目地址: https://github.com/cobub/razor
官網: www.cobub.com

相關文章
相關標籤/搜索