天天看點

ELK日志分析平台

什麼是ELK呢?

ELK是三個元件的縮寫, 分别是elasticsearch, logstash, kibana. ELK平台可以用于實作日志收集、日志搜尋和日志分析

1.elasticsearch(es): 它是個開源分布式搜尋引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多資料源,自動搜尋負載等。

2.logstash: 簡單說是一個日志收集工具, 可以定義從哪裡擷取資料, 并且可以簡單處理資料, 最後可以定義将資料輸出到哪裡, 一般輸出到es.

3.kibana: 其實就是一個資料展示界面, 并且可以分析資料, 例如從es中讀取資料進行展示分析. es自己也帶有簡單的展示dashboard: http://127.0.0.1:9200/_plugin/head/, 當然 前提是你安裝了head插件

如何搭建一個ELK日志分析平台呢?

一.單機安裝elasticsearch

1.利用安裝elasticsearch的rpm包安裝

yum install elasticsearch-..rpm
           

2.配置elasticsearch的配置檔案

cd /etc/elasticsearch/
vim elasticsearch.yml                     # 主配置檔案
 cluster.name: my-es                    # 叢集的名稱my-es
 node.name: server1                     # 目前節點的主機名
 path.data: /var/lib/elasticsearch/     # 資料目錄
 path.logs: /var/log/elasticsearch/     # 日志目錄
 network.host:                # 目前主機的IP
 http.port:                         # 對外端口号
           
ELK日志分析平台
ELK日志分析平台
ELK日志分析平台

3.安裝java環境(因為Elasticsearch是用Java開發的)

rpm -ivh jdk-u121-linux-x64.rpm
           

4.啟動elasticsearch服務

ELK日志分析平台

打開服務後可以在浏覽器中輸入目前主機的IP和端口号檢視(隻有簡單的資料,沒有圖形界面也沒有分析等,是以我們選擇安裝相應圖形界面的插件,友善分析處理資料)

ELK日志分析平台

5.安裝插件:

cd /usr/share/elasticsearch/
cd /bin
./plugin list     # 檢視已經安裝的插件
/usr/share/elasticsearch/bin/plugin install file:/root/elk/elasticsearch-head-master.zip
           
ELK日志分析平台

6.安裝插件以後,我們在浏覽器中檢視,得到的就是比較便于觀察和分析的web界面

ELK日志分析平台

7.在該web界面下建立索引嘗試查詢

ELK日志分析平台

二 . 叢集Elasticsearch的安裝和配置

Elasticsearch是一個開源的高擴充的分布式全文檢索引擎,它可以近乎實時的存儲、檢索資料;本身擴充性很好,可以擴充到上百台伺服器,處理PB級别的資料。
ES可以作為一個獨立的單個搜尋伺服器。不過,為了處理大型資料集,實作容錯和高可用性,ES可以運作在許多互相合作的伺服器上。這些伺服器的集合稱為叢集。
           

1.在server2和server3上安裝elasticsearch-2.3.3.rpm和jdk-8u121-linux-x64.rpm

rpm -ivh jdk-u121-linux-x64.rpm
yum install elasticsearch-.rpm
           

2.編輯sevre1上的配置檔案elasticsearch.yml

行 discovery.zen.ping.unicast.hosts: ["server1", "server2","server3"]
# 表示該叢集由三台主機構成,主機名分别是server1,server2和server3
           

将修改好的配置檔案發送給server2和server3上,在server2上和server3上修改配置檔案中的sevrername和ip

3.啟動server2和sevrer3上的服務

/etc/init.d/elasticsearch start

4.為了将叢集中三台主機所負責的功能子產品分開,我們在配置檔案中設定:

server1:

#server1是主節點,同時承擔http查詢任務
vim elasticsearch.yml
  node.name: server1
  node.master: true      
  node.data: false
  http.enabled: true
           
ELK日志分析平台

server2:

# server2負責存儲資料和http查詢任務
vim elasticsearch.yml
 node.name: server2     
 node.master: false
 node.data: true
 http.enabled: true
           

server3:

# server3和server2相同
vim elasticsearch.yml
 node.name: server2  
 node.master: false
 node.data: true
 http.enabled: true
           
ELK日志分析平台

5.重新開機所有節點上的服務,在浏覽器中檢視web界面

ELK日志分析平台

6.查詢叢集的狀态

ELK日志分析平台

資料查詢(三個節點上的node.data均為true)

curl /_nodes/_local
           
ELK日志分析平台

删除demo索引

ELK日志分析平台
ELK日志分析平台

三.logstash的安裝與配置

Logstash是開源的伺服器端資料處理管道,能夠同時從多個來源采集資料,轉換資料,然後将資料發送到您喜歡的“存儲庫”中。(我們的存儲當然是Elasticsearch。)

1.安裝logstash工具

添加不同的子產品:

1.标準終端輸入stdin和輸出stdout子產品

/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { } }'
# input輸入是從終端标準輸出
Settings: Default pipeline workers: 
Pipeline main started
hello   # 标準輸入hello
-08-T02::Z server1 hello    # 标準輸出hello
world
-08-T02::Z server1 world
^CSIGINT received. Shutting down the agent. {:level=>:warn}   # ctrl+c中斷
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台

2.在标準終端輸出的時候選擇輸出資料格式codec => rubydebug

/opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
Settings: Default pipeline workers: 
Pipeline main started
hello          # 标準輸入
{
       "message" => "hello",             # 輸出
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:38:09.060Z",
          "host" => "server1"
}
world
{
       "message" => "world",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:38:12.447Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台

3.标準終端輸出,輸出到提供elasticsearch的主機(server1)中

/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } }'
Settings: Default pipeline workers: 
Pipeline main started
hello
hello world
hello jay        # 無終端輸出,是因為将資料輸出到了elasticsearch中
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}


Pipeline main has been shutdown
           

在浏覽器中檢視:

ELK日志分析平台

4.上邊幾種情況的集合,标準終端輸入,輸出分為兩部分,一部分輸出到elasticsearch ,另一種是輸出到終端…

/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["172.25.1.1"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } }'
Settings: Default pipeline workers: 
Pipeline main started
hello world
{
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:42:38.615Z",
          "host" => "server1"
}
hello linux
{
       "message" => "hello linux",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:42:42.556Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}

Pipeline main has been shutdown
           
ELK日志分析平台
ELK日志分析平台

5.上邊的各種子產品都是直接在指令行選擇子產品,輸入或者輸出。我們也可以在檔案中編寫使用的子產品,選擇輸入和輸出,

cd /etc/logstash/conf.d/
vim es.conf                # 檔案名,可以随意取   
input {
        stdin {}           # 輸入是标準終端輸入standard  input
}

output {
        elasticsearch {                  # 第一個輸出是到elasticsearch
                hosts => ["172.25.1.1"]  # elasticsearch所在的主機
                index => "logstash-%{+YYYY.MM.dd}"
        }

        stdout {                         # 第二個輸出是标準終端輸出
                codec => rubydebug       # 輸出的風格是rubydebug
        }
}
           

在終端的運作情況:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf   # 在終端利用logstash運作此檔案
Settings: Default pipeline workers: 
Pipeline main started
hello qzy        # 标準終端輸入
{
       "message" => "hello qzy",    # 輸出的一部分,在終端标準輸出
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:38.949Z",
          "host" => "server1"
}
hello jay
{
       "message" => "hello jay",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:43.771Z",
          "host" => "server1"
}
nice to meet you
{
       "message" => "nice to meet you",
      "@version" => "1",
    "@timestamp" => "2018-08-25T02:46:58.730Z",
          "host" => "server1"
}
^CSIGINT received. Shutting down the agent. {:level=>:warn}
stopping pipeline {:id=>"main"}


Pipeline main has been shutdown
           
ELK日志分析平台

在浏覽器中的資料輸出:

ELK日志分析平台

6.rsyslog子產品:

将server1當作一個日志收集伺服器

(1).編輯一個使用子產品的檔案

vim message.conf
input {
        syslog {
                port =>     # 輸入是server2的日志,同步日志端口為/udp
        }
}


output {
#       elasticsearch {
#               hosts => ["172.25.1.1"]      # 輸出到server1的elasticsearch
#               index => "message-%{+YYYY.MM.dd}"
#       }

        stdout {
                codec => rubydebug     # 輸出到标準螢幕輸出
        }
}
           

(2).在sevrer2中編輯同步日志的檔案

vim /etc/rsyslog.conf
*.*     @@172:
/etc/init.d/rsyslog restart    # 重新打開rsyslog服務
           

(3).檢視rsyslog的端口和運作該模式的結果

在server1上netstat -antulp | grep 514

ELK日志分析平台

在server1以終端占用的方式執行

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf

ELK日志分析平台

在server1上可以收集到server2上的日志資訊

(4).在server上執行logger tigger,在server1上立即可以看到trigger的輸出

ELK日志分析平台

7.利用logstash中的子產品将日志記錄中的多行輸出變為一行:

(1).在elasticsearch的日志記錄檔案中

cd /var/log/elasticsearch
cat my-es.log
           

看到以[]為界線的日志有時候并不在一行

ELK日志分析平台

(2).利用filter對輸入進行過濾處理再指定輸出

vim  /etc/logstash/conf.d/message.conf
input {
        file {
                path => "/var/log/elasticsearch/my-es.log"       # 待處理日志所在位置
                start_position => "beginning"                    # 從日志的開始處處理
        }
}

filter {
        multiline {
        pattern => "^\["
        negate => true
        what => "previous"
        }
}


output {
        elasticsearch {
                hosts => ["172.25.1.1"]
                index => "es-%{+YYYY.MM.dd}"
        }

        stdout {
                codec => rubydebug
        }
}
           
ELK日志分析平台

(3).在終端執行操作

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/message.conf
# 因為在終端出有大量的java日志,是以就不再展示
           
  1. 這裡有一個需要注意的點:我們在message.conf中寫的是從日志檔案的beginning開始,但是,此時我們接着往日志中寫東西,我們發現是從上次結束的地方開始,看起來好像與我們的設定出現差異,但是不然,如果又從頭開始記錄,必然會造成資訊的重複。

    在linux中,我們有檔案專門記錄日志的編号:

    cat /root/.sincedb_452905a167cf4509fd08acb964fdb20c

    913943 0 64768 32581

    ls -i /var/log/messages

    913943 /var/log/messages

    ELK日志分析平台

這兩個數字是一樣的,最後一個日志表示此時日志的位置為32581,當我們在日志中接着寫點東西的時候,該數字會發生變化,即表示下次記錄的時候從此位置開始

logger cat

cat .sincedb_452905a167cf4509fd08acb964fdb20c (該檔案不發生變更,是不會重複讀的)

913943 0 64768 32751

ELK日志分析平台

9.利用filter使httpd的日志按照規定格式輸出:

1.編輯一個處理httpd日志的檔案test.conf

vim test.conf
input {
        stdin {}       # 輸入是終端标準輸入
}
filter {
        grok {
                match => { "message" => "%IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
                # 利用filter對輸入的資料進行過濾,轉換為指定格式指定
        }
}

output {
        stdout {
                codec => rubydebug    # 标準終端輸出
        }
}
           

在終端中

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
  GET /index.html        # 标準輸入
           
ELK日志分析平台

2.引用系統中的變量對httpd服務的輸出日志進行處理,按照指定格式輸出

vim message.conf
input {
        file {
                path => ["/var/log/httpd/access_log","/var/log/httpd/error_log"]    # 日志檔案所在的位置
                start_position => "beginning"   # 開始同步的位置=>檔案開始處
        }
}

filter {
        grok {
                match => { "message" => "%{COMBINEDAPACHELOG}" }     
                # 引用變量COMBINEDAPACHELOG
        }

}


output {
        elasticsearch {
                hosts => ["172.25.1.1"]
                index => "apache-%{+YYYY.MM.dd}"
        }

        stdout {
                codec => rubydebug
        }
}
           

3.在httpd的預設釋出目錄寫預設釋出檔案,在主配置檔案中可以看到預設的日志輸出格式

ELK日志分析平台
ELK日志分析平台

引用變量的位置在

/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/

vim grok-patterns

ELK日志分析平台

在終端執行輸出:

ELK日志分析平台

四.在server3上安裝kibana

Kibana是一個開源的分析與可視化平台,設計出來用于和Elasticsearch一起使用的

1.安裝rpm包

2.編輯其主配置檔案,寫

cd /opt/kibana/config/
vim   kibana.yml
           
ELK日志分析平台

3.打開服務并檢視端倪口

/etc/init.d/kibana start
netstat -antlp
           
ELK日志分析平台

五.ELK日志分析工具之間的解耦

思路:從nginx的日志檔案中得到資料放在logstash中,由logstash将資料存在redis中,再由logstash将資料從redis中拿出來交給kibana,這樣下來,資料經過redis,保證了資料的安全性也使得logstash和kibana之間得資料不是直接關聯,降低了耦合性。

(一).基本服務的配置

1.在server1上安裝nginx

2.在server2上安裝redis

tar zxf redis-.tar.gz
cd redis-
make                # 來一波簡單的源碼編譯
make install 
           

3.打開redis

cd /root/redis-./src/utils/
./install_server.sh
檢視redis的端口netstat -antlp
           
ELK日志分析平台

(二).nginx的安裝

1.在server1上安裝nginx

2.檢視nginx的日志格式,nginx的配置檔案

cd /etc/nginx/
vim nginx.conf
           
ELK日志分析平台

3.引用apache的日志格式變量

cd /opt/logstash/vendor/bundle/jruby//gems/logstash-patterns-core-/patterns/
vim grok-patterns
           

4.編輯nginx.conf來對nginx的日志做處理

vim nginx.conf
input {
        file {
                path => "/var/log/nginx/access.log"  # nginx的日志
                start_position => "beginning"
        }
}

filter {
        grok {
                match => { "message" => "%{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" }     # 在apache日志的前提下再加上自己的日志輸出
        }
}
output {
        redis {
                host => ["172.25.1.2"]
                port =>     # 輸出到server2的redis端口
                data_type => "list"   # 在redis中以清單形式存儲
                key => "logstash:redis"  # 定義清單形式的鍵值對
        }
        stdout {
                codec => rubydebug
        }
}
           
ELK日志分析平台

修改nginx的日志權限

5.在終端執行處理nginx日志的檔案

6.在實體機進行壓測ab -c 1 -n 10 http://172.25.1.1/index.html在server1上看日志輸出

(三).在server2上安裝noarch

rpm -ivh logstash--noarch.rpm
cd /etc/logstash/conf.d/
vim es.conf
input {           
    redis {   # 從redis中拿資料
        host => "172.25.1.2"
                port => 
                data_type => "list"
                key => "logstash:redis"       # 格式和上邊的保持一緻
    }
}

output {
    elasticsearch {                      # 輸出是将資料輸出到elasticsearch中
                hosts => ["172.25.1.1"]
                index => "nginx-%{+YYYY.MM.dd}"
        }
}
           
ELK日志分析平台

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf

在網頁中重新整理,出現nginx

ELK日志分析平台

(四).在server3上配置kibana對獲得的資料進行分析

選擇要建立視圖的項目:

ELK日志分析平台

建立反映資訊的試圖:

ELK日志分析平台

建立聯系人或者時間(根據需要選擇)

ELK日志分析平台

将建立的視圖添加到視圖框中:

ELK日志分析平台
ELK日志分析平台

根據自己的需要添加相應的子產品來對資料進行分析,最終展現出來:

ELK日志分析平台

繼續閱讀