Elastic Stack 日誌分析平臺搭建筆記

原文: http://nullwy.me/2019/01/elas...
若是以爲個人文章對你有用,請隨意讚揚

Elastic Stack(舊稱 ELK Stack))是最受歡迎的開源日誌平臺 [ref ]。Elastic Stack 由 Elasticsearch、Logstash、Kibana 和 Beats 四個組件組成:html

  • Beats,是輕量型採集器的平臺,從邊緣機器向 Logstash 和 Elasticsearch 發送數據。
  • Logstash,集中、轉換和存儲數據,是動態數據收集管道,擁有可擴展的插件生態系統,可以與 Elasticsearch 產生強大的協同做用。
  • Elasticsearch,搜索、分析和存儲您的數據,是基於 JSON 的分佈式搜索和分析引擎,專爲實現水平擴展、高可靠性和管理便捷性而設計。
  • Kibana,實現數據可視化,導覽 Elastic Stack。可以以圖表的形式呈現數據,而且具備可擴展的用戶界面,供您全方位配置和管理 Elastic Stack。

Elastic Stack 是逐步發展而來的,一開始只有 Elasticsearch,專一作搜索引擎,2013 年 1 月 Kibana 及其做者 Rashid Khan 加入 Elasticsearch 公司,同年 8 月 Logstash 及做者 Jordan Sissel 也加入,本來的非官方的 ELK Stack,正式成爲官方用語。2015 年 3 月,舊金山舉行的第 1 屆 Elastic{ON} 大會上,Elasticsearch 公司更名爲 Elastic。兩個月後,Packetbeat 項目也加入 Elastic,Packetbeat 和 Filebeat(以前叫作 Logstash-forwarder,由 Logstash 做者 Jordan Sissel 開發)項目被整合改造爲 Beats。加上 Beats 之後,官方不知道如何將 「B」 和 E-L-K 組合在一塊兒(用過 ELKB 或 BELK),ELK Stack 因而更名爲 Elastic Stack,並在 2016 年 10 月正式發佈 Elastic Stack 5.0 [ref1, ref2, ref3 ]。nginx

使用 Logstash

Logstash(home, github)最初是來自 Dreamhost 運維工程師 Jordan Sissel 的開源項目,是管理事件和日誌的工具,可以用於採集數據,轉換數據,而後將數據發送到您最喜歡的「存儲庫」中(好比 Elasticsearch)。Logstash 使用 JRuby 開發,2011 年 5 月發佈 1.0 版本。2013 年 8 月 Jordan Sissel 帶着 Logstash 加入 Elasticsearch 公司,Logstash 成爲 Elastic Stack 一員。git

在 Ubuntu 下安裝啓動 Logstash 可使用下面命令:github

$ sudo apt-get install logstash                # 安裝 logstash
$ sudo systemctl start logstash.service        # 系統服務方式啓動 logstash
$ /usr/share/logstash/bin/logstash --version   # 查看 logstash 版本
logstash 6.5.4
$ sudo vim /etc/logstash/logstash.yml          # 查看默認 logstash.yml
$ sudo vim /etc/logstash/logstash-sample.conf  # 查看示例 logstash-sample.conf

安裝完成後,二進制文件在 /usr/share/logstash/bin 目錄下,配置文件位於 /etc/logstash 目錄,日誌輸出位於 /var/log/logstash 目錄,其餘詳細的目錄位置的分佈狀況,能夠閱讀官方文檔web

最簡單的示例

Logstash 管道(pipeline)由 inputfilteroutput 三個元素組成,其中 inputoutput 必須設置,而 filter 可選。input 插件從數據源中消費數據,filter 插件按指定方式修改數據,output 插件將數據寫入特定目標中 [doc ]。正則表達式

Logstash 管道

如今來試試 Logstash 下 Hello Wolrd 級別的示例,運行下面命令:redis

$ sudo /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e 選項可以使 Logstash 直接在命令行中設置管道配置。示例中 input 插件爲 stdin (標準輸入),output 插件是 stdout (標準輸出)。若在控制檯輸入 hello world,相應的控制檯將輸出:express

{
      "@version" => "1",
          "host" => "ubuntu109",
    "@timestamp" => 2019-01-12T05:52:56.291Z,
       "message" => "hello world"
}

值得注意的是,輸出內容編碼格式默認爲 rubydebug,使用 Ruby 的 "awesome_print" 庫打印。另外,響應輸出 @timestamp 字段的值爲 2019-01-12T05:52:56.291Z,這是 ISO 8601 時間格式,時區是 0(zero),和北京時間相差 8 個小時。apache

輸出內容編碼格式,能夠經過 codec 指令指定。除了默認的 rubydebug 外,官方還支持其餘 20 多種編碼格式,參見 doc。若把編碼格式改成 json,即 stdout { codec => json },輸出結果將變成:json

{"message":"hello world","@version":"1","@timestamp":"2019-01-12T05:52:56.291Z","host":"ubuntu109"}

管道配置也能夠保存到文件中,以 *.conf 做爲文件後綴,好比保存爲 test-stdin-stdout.conf

input {
  stdin { }
}
output {
  stdout { }
}

啓動 logstash 時,-f 選項用於指定管道配置文件的路徑:

$ sudo /usr/share/logstash/bin/logstash -f ~/test-stdin-stdout.conf

默認狀況下,在啓動 logstash 後,若再修改管道配置文件,新的修改須要重啓 logstash 才能加載生效。在開發調試時,不太方便。解決這個問題,可使用 -r 命令行選項。開啓這個選項後,只要肯定配置文件已經發生變動,便會自動從新加載配置文件。

file 輸入插件

上文日誌是控制檯輸入的,但真實狀況日誌在日誌文件中,要想使用 Logstash 讀取日誌文件,官方提供了 file 輸入插件。管道配置文件示例 test-file-stdout.conf,以下:

input {
 file {
   path => ["/home/yulewei/test.log"]
   sincedb_path => "/dev/null"
   start_position => "beginning"
  }
}
filter {
}
output {
  stdout {
    codec => rubydebug
  }
}

啓動 Logstash:

$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-stdout.conf

配置文件中的 path 指令用於指定日誌文件的路徑。start_position 指令設置 Logstash 啓動時讀取日誌文件的位置,能夠設置爲 beginning 或者 end,默認是 end,即文件末尾。

爲了跟蹤每一個輸入文件中已處理了哪些數據,Logstash 文件輸入插件會使用名爲 sincedb 的文件來記錄現有位置。因爲咱們的配置用於開發,因此咱們但願可以重複讀取文件,並進而但願禁用 sincedb 文件。在 Linux 系統上,將 sincedb_path 指令設置爲 「/dev/null」 便可禁用。若沒有禁用,默認保存的 sincedb 文件將在 /usr/share/logstash/data/plugins/inputs/file/ 目錄下。

grok 過濾插件

上文的例子,作的核心事情就是把日誌行轉換到 message 字段,並附加某些元數據,如 @timestamp。若是要想解析本身的日誌,把非結構化日誌轉換結構換日誌,有兩個過濾器特別經常使用:dissect 會根據分界符來解析日誌,而 grok 則會根據正則表達式匹配來運行。

若是數據結構定義很是完善,dissect 過濾插件的運行效果很是好,並且運行速度很是快捷高效。同時,其也更加容易上手,對於不熟悉正則表達式的用戶而言,更是如此。一般而言,grok 的功能更增強大,並且能夠處理各類各樣的數據。然而,正則表達式匹配會耗費更多資源,並且速度也會慢一些,若是未能正確進行優化的話,尤其如此。

如今先來看下 grok 過濾插件。grok 模式的基本語法是 %{SYNTAX:SEMANTIC}SYNTAX 是用於匹配數據的模式(或正則表達式)名稱,SEMANTIC 是標識符或字段名稱。Logstash 提供了超過 120 種默認的 grok 模式,所有預約義的模式能夠在 github 上找到。典型的預約義模式(非完整列表) [github ]:

  • WORD - 匹配單個詞彙的模式
  • NUMBER - 匹配整數或浮點數(正值或負值都可)的模式
  • POSINT - 匹配正整數的模式
  • EMAILADDRESS - 郵箱地址
  • IP - 匹配 IPv4 或 IPv6 IP 地址的模式
  • URI - URI 地址
  • TIMESTAMP_ISO8601 - ISO8601 格式的時間
  • NOTSPACE - 匹配非空格的任何內容的格式
  • SPACE - 匹配任何數量的連續空格的模式
  • DATA - 匹配任何數據類型的限定數量的模式
  • GREEDYDATA - 匹配剩餘全部數據的格式

好比,3.44 可使用 NUMBER 模式進行匹配,192.168.2.104 可使用 IP 模式。%{NUMBER:num} %{IP:client} 模式,將會用 NUMBER 模式把 3.44 識別爲 num 字段,用 IP 模式把 192.168.2.104 識別爲 client 字段。默認狀況識別得到的字段值是字符串類型,grok 插件支持把類型轉換爲 intfloat。要想把 3.44 轉換爲浮點數,可使用 %{NUMBER:num:float}

假設有以下日誌內容:

Will, yulewei@gmail.com, 42, 1024, 3.14

grok 匹配表達式能夠寫成這樣:

%{WORD:name}, %{EMAILADDRESS:email}, %{NUMBER:num1}, %{NUMBER:num2:int}, %{NUMBER:pi:float}

即,在這一行日誌中依次提取出,nameemailnum1num2pi 字段。完整的 filter 過濾器配置的寫法:

filter {
  grok {
    match => { "message" => "%{WORD:name}, %{EMAILADDRESS:email}, %{NUMBER:num1}, %{NUMBER:num2:int}, %{NUMBER:pi:float}" }
  }
}

啓動 logstash:

$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-grok-stdout.conf

控制檯將輸出:

{
      "@version" => "1",
       "message" => "Will, yulewei@gmail.com, 42, 1024, 3.14",
          "num1" => "42",
            "pi" => 3.14,
    "@timestamp" => 2019-01-12T08:12:49.581Z,
          "path" => "/home/yulewei/test-grok.log",
          "host" => "ubuntu109",
         "email" => "yulewei@gmail.com",
          "name" => "Will",
          "num2" => 1024
}

Logstash 提供了超過 120 種默認的 grok 模式,基本上知足大多數使用場景。若沒有符合要求的預約義的模式,可使用 Oniguruma 語法指定正則表達式:

(?<field_name>the pattern here)

上文中的 %{WORD:name}%{EMAILADDRESS:email},等價的正則表達式的寫法以下 [ref1, ref2 ]:

(?<name>\w+)
(?<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@[0-9A-Za-z][0-9A-Za-z-]{0,62}\.[0-9A-Za-z][0-9A-Za-z-]{0,62})

調試 grok 匹配表達式容易出錯,官方提供可視化的 Grok Debugger 工具,提升調試效率。

Grok Debugger

解析 http 服務器日誌

如今來看下,真實的日誌解析案例,使用 grok 過濾插件解析 http 服務器日誌。通用日誌格式(Common Log Format),是 http 服務器的標準的日誌格式。對通用日誌格式擴展,加上額外的 referer 和 user-agent 字段,稱爲組合日誌格式(Combined Log Format)。兩種日誌格式包含的字段以下:

# 通用日誌格式
%remote-host %ident %authuser %timestamp "%request" %status %bytes
# 組合日誌格式
%remote-host %ident %authuser %timestamp "%request" %status %bytes "%referer" "%user-agent"

ApacheNginx 服務器默認的日誌格式,採用的就是通用日誌格式或者組合日誌格式。解析這兩種日誌格式,Logstash 提供預約義模式 COMMONAPACHELOGCOMBINEDAPACHELOG

典型的 nginx 日誌例子:

192.168.2.104 - - [13/Jan/2019:02:01:15 +0800] "GET /images/avatar.png HTTP/1.1" 200 266975 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:64.0) Gecko/20100101 Firefox/64.0"

管道配置文件示例 test-file-grokhttp-stdout.conf,以下:

input {
  file {
    path => ["/var/log/nginx/access.log"]
    sincedb_path => "/dev/null"
    start_position => "beginning"
  }
}
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
    remove_field => ["message"]
  }
}
output {
  stdout { }
}

示例中使用了 grok 的預約義模式 COMBINEDAPACHELOG。另外,remove_field 指令用於把輸出事件中某字段刪除,示例中是 message 字段。

啓動 logstash:

$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-grokhttp-stdout.conf

解析得到的結構化數據,以下:

{
           "auth" => "-",
           "host" => "ubuntu109",
           "verb" => "GET",
       "clientip" => "192.168.2.104",
       "@version" => "1",
    "httpversion" => "1.1",
     "@timestamp" => 2019-01-13T13:35:52.983Z,
          "bytes" => "266975",
      "timestamp" => "13/Jan/2019:02:01:15 +0800",
        "request" => "/images/avatar.png",
       "response" => "200",
       "referrer" => "\"-\"",
           "path" => "/var/log/nginx/access.log",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:64.0) Gecko/20100101 Firefox/64.0\"",
          "ident" => "-"
}

dissect 過濾插件

和 grok 過濾插件使用正則表達式提取字段不一樣,dissect 過濾插件使用分界符切割來提取字段。因爲沒有使用正則表達式,運行速度相對 grok 快不少。使用 dissect 過濾插件時,須要指明提取字段的順序,還要指明這些字段之間的分界符。過濾插件會對數據進行單次傳輸,並匹配模式中的分界符。同時,過濾插件還會將分界符之間的數據分配至指定字段。過濾插件不會對所提取數據的格式進行驗證。

如今看下示例,test-dissect.log 文件內容以下:

Will, yulewei@gmail.com, 42, 1024, 3.14

dissect 匹配規則能夠寫成這樣:

%{name}, %{email}, %{num1}, %{num2}, %{num3}

完整的配置文件,test-file-dissect-stdout.conf

input {
 file {
   path => ["/home/yulewei/test-dissect.log"]
   sincedb_path => "/dev/null"
   start_position => "beginning"
  }
}
filter {
  dissect {
    mapping => {
      "message" => "%{name}, %{email}, %{num1}, %{num2}, %{num3}"
    }
    convert_datatype => {
      "num2" => "int"
      "num3" => "float"
    }
  }
}
output {
  stdout { }
}

和 grok 插件同樣,默認提取的字段是字符串類型。配置文件中的 convert_datatype 指令用於將類型轉爲 intfloat

啓動 logstash:

$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-dissect-stdout.conf

輸出結果:

{
          "host" => "ubuntu109",
          "num1" => "42",
       "message" => "Will, yulewei@gmail.com, 42, 1024, 3.14",
      "@version" => "1",
          "name" => "Will",
          "num2" => 1024,
    "@timestamp" => 2019-01-13T13:32:10.900Z,
          "path" => "/home/yulewei/test-dissect.log",
         "email" => "yulewei@gmail.com",
          "num3" => 3.14
}

輸出到 Elasticsearch

上文舉的例子所有都是,輸出控制檯,使用 stdout 輸出插件,沒有實用價值。Elastic Stack 的核心實際上是 Elasticsearch,使用Elasticsearch 搜索和分析日誌。想要將數據發送到 Elasticsearch,可使用 elasticsearch 輸出插件。

安裝 Elasticsearch

若是沒有安裝 Elasticsearch,參考官方文檔按步驟安裝。惟一要注意的是,在執行 apt install 命令前,必須先添加 elastic 的軟件源地址,不然沒法正常啓動。核心命令以下:

$ sudo apt-get install elasticsearch           # 安裝 elasticsearch
$ sudo systemctl start elasticsearch.service   # 系統服務方式啓動 elasticsearch
$ curl http://localhost:9200/                  # 用 rest 接口查看 elasticsearch
{
  "name" : "1t9JXt5",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "yQgVsvupSqGCGQbwqnanIg",
  "version" : {
    "number" : "6.5.4",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

默認狀況下 elasticsearch 服務器綁定的 ip 地址是迴環地址 127.0.0.1,若想綁定特定 ip 地址,能夠修改 /etc/elasticsearch/elasticsearch.yml 配置文件中的 network.host 選項:

network.host: 192.168.2.109

修改完成並重啓後,elasticsearch 服務器訪問地址從 http://localhost:9200/ 變成 http://192.168.2.109:9200/

輸出到 Elasticsearch

如今來看下 elasticsearch 輸出插件。示例,test-file-elasticsearch.conf

input {
 file {
   path => ["/home/yulewei/test.log"]
   sincedb_path => "/dev/null"
   start_position => "beginning"
  }
}
output {
  elasticsearch {
    hosts => ["http://192.168.2.109:9200"]
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

示例的 elasticsearch 輸出插件使用了 hostsindex 指令。hosts 指令,用於指定 elasticsearch 服務器的地址。而 index 指令,用於指定 elasticsearch 索引的名稱模式,該指令默認值爲 logstash-%{+YYYY.MM.dd}。在字符串內部的 %{...},是 Logstash 字符串插值語法,官方稱之爲 sprintf format [doc ]。+YYYY.MM.dd,用於指定 @timestamp 的格式化的格式。logstash-%{+YYYY.MM.dd},格式化後最終生成的值可能將是 logstash-2019.01.13

啓動 logstash:

$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-elasticsearch.conf

查看在 elasticsearch 上新建立的 logstash-* 索引以及從 logstash 同步過來的日誌數據:

$ curl http://192.168.2.109:9200/_cat/indices
yellow open logstash-2019.01.13       tFjc5xL_QYeNw4oqe4odeg 5 1     3 0 15.5kb 15.5kb
$ curl 'http://192.168.2.109:9200/logstash-*/_search?pretty' -H 'Content-Type: application/json' -d'{"size": 1}'
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "logstash-2019.01.13",
        "_type" : "doc",
        "_id" : "RUHNRWgBLIBntI4FV8Rf",
        "_score" : 1.0,
        "_source" : {
          "path" : "/home/yulewei/test.log",
          "@timestamp" : "2019-01-13T06:01:51.303Z",
          "@version" : "1",
          "host" : "ubuntu109",
          "message" : "hello world"
        }
      }
    ]
  }
}

能夠看到,新的索引名爲 logstash-2019.01.13。同步過來的日誌記錄所有有 5 條,第 1 條日誌的 message 內容是 hello world

使用 Kibana

Kibana,可以對 Elasticsearch 中的數據進行可視化,是 Elastic Stack 的窗口。在 Ubuntu 下安裝 Kibana 可使用下面命令:

$ sudo apt-get install kibana          # 安裝 kibana,當前最新版爲 6.5.4
$ sudo systemctl start kibana.service  # 系統服務方式啓動 kibana

默認配置下,kibana 服務訪問地址是 http://localhost:5601/,鏈接的 elasticsearch 地址是 http://localhost:9200,這兩個配置分別由 server.hostelasticsearch.url 控制 [doc ]。上文嘗試過把 elasticsearch 服務 ip 地址綁定到 192.168.2.109。如今來試下綁定 ip 地址到 kibana,編輯配置文件 /etc/kibana/kibana.yml,修改成:

server.host: "192.168.2.109"
elasticsearch.url: "http://192.168.2.109:9200"

使用 sudo systemctl restart kibana.service 重啓後,kibana 服務訪問地址變成 http://192.168.2.109:5601/

elasticsearch 服務器上存在索引 logstash-2019.01.13,要想把這個索引導入到 kibana,參考官方教程便可。點擊 Management 菜單,而後建立索引模式(index pattern)。索引模式能夠直接爲 logstash-2019.01.13,這樣匹配單個索引。若要匹配多個時間的 logstash 索引,可使用通配符 *,好比 logstash-*。若是要匹配所有 2019 年 01 月的索引,能夠寫成 logstash-2019.01*。完成索引模式定義後,即可以在 Discover 菜單下查看索引,如圖:

Kibana

使用 Filebeat

Filebeat,輕量型日誌採集器 [home ]。其前身是由 Logstash 做者 Jordan Sissel 開發的 Logstash Forwarder。Logstash Forwarder 項目由於和收購過來的 Packetbeat 項目功能相近,而且都是 Go 語言開發,就一塊兒被整合改造爲 Beats [ref ]。

咱們知道,Logstash 使用 JRuby 開發,運行依賴 JVM,會消耗較多的系統資源。爲了減小系統資源(CPU、內存和網絡)的使用,Logstash Forwarder 改用 Go 語言開發。另外,在功能上也作了精簡,只作單一的數據傳輸,不像 Logstash 有數據過濾能力。Logstash 相似於功能多樣的「瑞士軍刀」,能提供從多個數據源加載數據的功能,使用各類強大的插件來處理日誌,並提供將多個來源的輸出數據進行存儲的功能。簡而言之,Logstash 提供數據 ETL(數據的提取、變換和加載)的功能;而 Beats 是輕量級的數據傳輸工具,能將數據傳輸到 Logstash 或 Elasticsearch 中,其間沒有對數據進行任何轉換 [Gupta2017 ]。Filebeat 和 Logstash 的關係以下圖所示 [logz.io ]:

Filebeat 和 Logstash 的關係

安裝 filebeat 很簡單,參考官方文檔便可,核心命令以下:

$ sudo apt-get install filebeat           # 安裝 filebeat
$ filebeat version                        # 查看 filebeat 版本
filebeat version 6.5.4 (amd64), libbeat 6.5.4 [bd8922f1c7e93d12b07e0b3f7d349e17107f7826 built 2018-12-17 20:22:29 +0000 UTC]
$ sudo systemctl start filebeat.service   # 系統服務方式啓動 filebeat

輸出到 Elasticsearch

修改 filebeat 配置文件 /etc/filebeat/filebeat.yml,示例以下:

filebeat.inputs:
- type: log
  paths:
    - /home/yulewei/test.log

output.elasticsearch:
  hosts: ["192.168.2.109:9200"]

filebeat.inputs 選項用於配置日誌的輸入方式。子選項 type 支持 logstdinredisudptcp 等,示例中使用了 log,代表從日誌文件輸入。

output 選項用於配置日誌的輸出方式,配置支持 elasticsearch、logstash、kafka、redis、file、console 等,一次只能選擇配置其中某一個。示例配置了 output.elasticsearch.hosts,指定日誌輸出目標 elasticsearch 的主機地址。output.elasticsearch.index 能夠用來指定索引 index 名稱模式,默認是 filebeat-%{[beat.version]}-%{+yyyy.MM.dd}(好比 filebeat-6.5.4-2019.01.12 [doc ]。

完成 filebeat.yml 修改後,重啓 filebeat,將能夠看到,在 elasticsearch 上新建立的 filebeat-* 索引:

$ curl http://192.168.2.109:9200/_cat/indices
yellow open filebeat-6.5.4-2019.01.12 B4JbQDnZQuK5XvsQ77uedA 3 1 11043 0  1.7mb  1.7mb

輸出到 Logstash

上文的示例直接把 Filebeat 採集的日誌傳輸到 Elasticsearch,日誌數據並無被解析或者轉換。若想解析和轉換日誌,須要在Filebeat 和 Elasticsearch 中間引入 Logstash。如今看下把日誌輸出到 Logstash 的示例配置文件,filebeat.yml 示例:

filebeat.inputs:
- type: log
  paths:
    - /home/yulewei/test.log

output.logstash:
  hosts: ["localhost:5044"]

filebeat.inputs 和上文的示例同樣。不一樣的是,把 output.elasticsearch.hosts 改爲了 output.logstash.hosts,指定日誌輸出目標 Logstash 的主機地址。5044 這個端口是 Logstash 用於監聽 Filebeat 的端口。

如今來看下 Logstash 的管道配置文件,示例 test-beats-stdout.conf

input {
  beats {
    port => 5044
  }
}
output {
  stdout {
    codec => rubydebug
  }
}

示例中,使用了 beats 輸入插件,配置的端口就 filebeat.yml 中指定的 5044。輸出插件爲 stdout,即把 Logstash 採集到日誌輸出到控制檯。

重啓 filebeat 和 logstash:

$ cat test.log                              # 查看日誌文件內容
hello world
$ sudo systemctl restart filebeat.service   # 重啓 filebeat
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-beats-stdout.conf

控制檯輸出:

{
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
        "source" => "/home/yulewei/test.log",
         "input" => {
        "type" => "log"
    },
       "message" => "hello world",
    "@timestamp" => 2019-01-12T13:32:05.131Z,
      "@version" => "1",
    "prospector" => {
        "type" => "log"
    },
          "beat" => {
        "hostname" => "ubuntu109",
         "version" => "6.5.4",
            "name" => "ubuntu109"
    },
        "offset" => 0,
          "host" => {
                   "os" => {
             "version" => "16.04.4 LTS (Xenial Xerus)",
            "platform" => "ubuntu",
            "codename" => "xenial",
              "family" => "debian"
        },
         "architecture" => "x86_64",
                   "id" => "29b1bf39547d4ca9ae26c3b7656ff9e3",
        "containerized" => false,
                 "name" => "ubuntu109"
    }
}

集成 Filebeat, Logstash, Elasticsearch, Kibana

真實場景下,日誌文件可能分佈在多臺服務器上,同一臺服務器上也可能分佈着不一樣來源類型的日誌。如今咱們來嘗試下,使用 Filebeat 把兩個日誌文件各自採集到兩個不一樣的 Elasticsearch 索引中,並用 Kibana 可視化。有兩個日誌文件 test-beats1.logtest-beats2.log,內容以下:

$ cat test-beats1.log
hello world1
hello world1
$ cat test-beats2.log
hello world2

filebeat.yml 配置示例:

filebeat.inputs:
- type: log
  paths:
    - /home/yulewei/test-beats1.log
  fields:
    log_type: test1
- type: log 
  paths:
    - /home/yulewei/test-beats2.log
  fields:
    log_type: test2

output.logstash:
  hosts: ["localhost:5044"]

示例配置文件使用了 filebeat.inputs.fields 選項,fields 選項用於在日誌事件輸出中添加字段。添加的字段名能夠任意指定,示例中名爲 log_type。由於如今在 filebeat 配置中同時導入兩個日誌文件,輸出到同一個 logstash 中。使用這個額外字段是爲了區分日誌是來自 test-beats1.log 仍是 test-beats2.log。示例中,第 1 個日誌事件輸出的 log_type 字段值配置爲 test1, 第 2 個日誌配置爲 test2

管道配置文件示例,test-beats-elasticsearch.conf

input {
  beats {
    port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["http://192.168.2.109:9200"]
    index => "filebeat-%{[fields][log_type]}-%{+YYYY.MM.dd}"
  }
  stdout {
    codec => rubydebug
  }
}

輸出插件同時使用了 elasticsearchstdout。配置文件中的 elasticsearch 輸出插件的 index 指令被設置爲 filebeat-%{[fields][log_type]}-%{+YYYY.MM.dd}[fields][log_type] 引用的是在 filebeat.ymlfilebeat.inputs.fields 選項添加的 log_type 字段(關於在配置文件引用字段的語法,能夠參考官方文檔)。根據 log_type 字段不一樣,把日誌將輸出到不一樣的索引中。由於 filebeat.yml 配置文件中設置的 log_type 字段是 test1 或者 test2,因此最終生成的索引名是 filebeat-test1-* 或者 filebeat-test1-*filebeat-test1-* 索引中所有日誌數據來自 test-beats1.log 日誌文件,filebeat-test2-* 索引數據來自 test-beats2.log

啓動 filebeat 和 logstash:

$ sudo systemctl restart filebeat.service
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-beats-elasticsearch.conf

控制檯輸出:

...
{
      "@version" => "1",
          "host" => {
        "name" => "ubuntu109"
    },
       "message" => "hello world2",
    "prospector" => {
        "type" => "log"
    },
        "fields" => {
        "log_type" => "test2"
    },
        "offset" => 0,
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
          "beat" => {
            "name" => "ubuntu109",
         "version" => "6.5.4",
        "hostname" => "ubuntu109"
    },
    "@timestamp" => 2019-01-13T09:32:11.845Z,
        "source" => "/home/yulewei/test-beats2.log",
         "input" => {
        "type" => "log"
    }
}
...

查看在 elasticsearch 上新建立的 filebeat-test1-*filebeat-test1-* 索引:

$ curl http://192.168.2.109:9200/_cat/indices/filebeat-*
yellow open filebeat-test1-2019.01.13 NLVfFJl5TQ-7I1r9KoVLaQ 5 1 5 0 31.8kb 31.8kb
yellow open filebeat-test2-2019.01.13 NnsBp3P9Q3-mLc8chE-Tiw 5 1 3 0 24.1kb 24.1kb

在 kibana 上查看收集的日誌:

Kibana

參考資料

相關文章
相關標籤/搜索