摘要:年月,舊金山舉行的第屆大會(huì)上,公司改名為。在系統(tǒng)上,將指令設(shè)置為即可禁用。配置文件中的指令用于將類型轉(zhuǎn)為或。在字符串內(nèi)部的,是字符串插值語(yǔ)法,官方稱之為。同步過(guò)來(lái)的日志記錄全部有條,第條日志的內(nèi)容是。
原文:http://nullwy.me/2019/01/elas...
如果覺(jué)得我的文章對(duì)你有用,請(qǐng)隨意贊賞
Elastic Stack(舊稱 ELK Stack))是最受歡迎的開(kāi)源日志平臺(tái) [ref ]。Elastic Stack 由 Elasticsearch、Logstash、Kibana 和 Beats 四個(gè)組件組成:
Beats,是輕量型采集器的平臺(tái),從邊緣機(jī)器向 Logstash 和 Elasticsearch 發(fā)送數(shù)據(jù)。
Logstash,集中、轉(zhuǎn)換和存儲(chǔ)數(shù)據(jù),是動(dòng)態(tài)數(shù)據(jù)收集管道,擁有可擴(kuò)展的插件生態(tài)系統(tǒng),能夠與 Elasticsearch 產(chǎn)生強(qiáng)大的協(xié)同作用。
Elasticsearch,搜索、分析和存儲(chǔ)您的數(shù)據(jù),是基于 JSON 的分布式搜索和分析引擎,專為實(shí)現(xiàn)水平擴(kuò)展、高可靠性和管理便捷性而設(shè)計(jì)。
Kibana,實(shí)現(xiàn)數(shù)據(jù)可視化,導(dǎo)覽 Elastic Stack。能夠以圖表的形式呈現(xiàn)數(shù)據(jù),并且具有可擴(kuò)展的用戶界面,供您全方位配置和管理 Elastic Stack。
Elastic Stack 是逐步發(fā)展而來(lái)的,一開(kāi)始只有 Elasticsearch,專注做搜索引擎,2013 年 1 月 Kibana 及其作者 Rashid Khan 加入 Elasticsearch 公司,同年 8 月 Logstash 及作者 Jordan Sissel 也加入,原本的非官方的 ELK Stack,正式成為官方用語(yǔ)。2015 年 3 月,舊金山舉行的第 1 屆 Elastic{ON} 大會(huì)上,Elasticsearch 公司改名為 Elastic。兩個(gè)月后,Packetbeat 項(xiàng)目也加入 Elastic,Packetbeat 和 Filebeat(之前叫做 Logstash-forwarder,由 Logstash 作者 Jordan Sissel 開(kāi)發(fā))項(xiàng)目被整合改造為 Beats。加上 Beats 以后,官方不知道如何將 “B” 和 E-L-K 組合在一起(用過(guò) ELKB 或 BELK),ELK Stack 于是改名為 Elastic Stack,并在 2016 年 10 月正式發(fā)布 Elastic Stack 5.0 [ref1, ref2, ref3 ]。
使用 LogstashLogstash(home, github)最初是來(lái)自 Dreamhost 運(yùn)維工程師 Jordan Sissel 的開(kāi)源項(xiàng)目,是管理事件和日志的工具,能夠用于采集數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù),然后將數(shù)據(jù)發(fā)送到您最喜歡的“存儲(chǔ)庫(kù)”中(比如 Elasticsearch)。Logstash 使用 JRuby 開(kāi)發(fā),2011 年 5 月發(fā)布 1.0 版本。2013 年 8 月 Jordan Sissel 帶著 Logstash 加入 Elasticsearch 公司,Logstash 成為 Elastic Stack 一員。
在 Ubuntu 下安裝、啟動(dòng) Logstash 可以使用下面命令:
$ sudo apt-get install logstash # 安裝 logstash $ sudo systemctl start logstash.service # 系統(tǒng)服務(wù)方式啟動(dòng) logstash $ /usr/share/logstash/bin/logstash --version # 查看 logstash 版本 logstash 6.5.4 $ sudo vim /etc/logstash/logstash.yml # 查看默認(rèn) logstash.yml $ sudo vim /etc/logstash/logstash-sample.conf # 查看示例 logstash-sample.conf
安裝完成后,二進(jìn)制文件在 /usr/share/logstash/bin 目錄下,配置文件位于 /etc/logstash 目錄,日志輸出位于 /var/log/logstash 目錄,其他詳細(xì)的目錄位置的分布情況,可以閱讀官方文檔。
最簡(jiǎn)單的示例Logstash 管道(pipeline)由 input、filter 和 output 三個(gè)元素組成,其中 input 和 output 必須設(shè)置,而 filter 可選。input 插件從數(shù)據(jù)源中消費(fèi)數(shù)據(jù),filter 插件按指定方式修改數(shù)據(jù),output 插件將數(shù)據(jù)寫(xiě)入特定目標(biāo)中 [doc ]。
現(xiàn)在來(lái)試試 Logstash 下 Hello Wolrd 級(jí)別的示例,運(yùn)行下面命令:
$ sudo /usr/share/logstash/bin/logstash -e "input { stdin { } } output { stdout {} }"
-e 選項(xiàng)能夠使 Logstash 直接在命令行中設(shè)置管道配置。示例中 input 插件為 stdin (標(biāo)準(zhǔn)輸入),output 插件是 stdout (標(biāo)準(zhǔn)輸出)。若在控制臺(tái)輸入 hello world,相應(yīng)的控制臺(tái)將輸出:
{ "@version" => "1", "host" => "ubuntu109", "@timestamp" => 2019-01-12T05:52:56.291Z, "message" => "hello world" }
值得注意的是,輸出內(nèi)容編碼格式默認(rèn)為 rubydebug,使用 Ruby 的 "awesome_print" 庫(kù)打印。另外,響應(yīng)輸出 @timestamp 字段的值為 2019-01-12T05:52:56.291Z,這是 ISO 8601 時(shí)間格式,時(shí)區(qū)是 0(zero),和北京時(shí)間相差 8 個(gè)小時(shí)。
輸出內(nèi)容編碼格式,可以通過(guò) codec 指令指定。除了默認(rèn)的 rubydebug 外,官方還支持其他 20 多種編碼格式,參見(jiàn) doc。若把編碼格式改為 json,即 stdout { codec => json },輸出結(jié)果將變成:
{"message":"hello world","@version":"1","@timestamp":"2019-01-12T05:52:56.291Z","host":"ubuntu109"}
管道配置也可以保存到文件中,以 *.conf 作為文件后綴,比如保存為 test-stdin-stdout.conf:
input { stdin { } } output { stdout { } }
啟動(dòng) logstash 時(shí),-f 選項(xiàng)用于指定管道配置文件的路徑:
$ sudo /usr/share/logstash/bin/logstash -f ~/test-stdin-stdout.conf
默認(rèn)情況下,在啟動(dòng) logstash 后,若再修改管道配置文件,新的修改需要重啟 logstash 才能加載生效。在開(kāi)發(fā)調(diào)試時(shí),不太方便。解決這個(gè)問(wèn)題,可以使用 -r 命令行選項(xiàng)。開(kāi)啟這個(gè)選項(xiàng)后,只要確定配置文件已經(jīng)發(fā)生變更,便會(huì)自動(dòng)重新加載配置文件。
file 輸入插件上文日志是控制臺(tái)輸入的,但真實(shí)情況日志在日志文件中,要想使用 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 } }
啟動(dòng) Logstash:
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-stdout.conf
配置文件中的 path 指令用于指定日志文件的路徑。start_position 指令設(shè)置 Logstash 啟動(dòng)時(shí)讀取日志文件的位置,可以設(shè)置為 beginning 或者 end,默認(rèn)是 end,即文件末尾。
為了跟蹤每個(gè)輸入文件中已處理了哪些數(shù)據(jù),Logstash 文件輸入插件會(huì)使用名為 sincedb 的文件來(lái)記錄現(xiàn)有位置。由于我們的配置用于開(kāi)發(fā),所以我們希望能夠重復(fù)讀取文件,并進(jìn)而希望禁用 sincedb 文件。在 Linux 系統(tǒng)上,將 sincedb_path 指令設(shè)置為 “/dev/null” 即可禁用。若沒(méi)有禁用,默認(rèn)保存的 sincedb 文件將在 /usr/share/logstash/data/plugins/inputs/file/ 目錄下。
grok 過(guò)濾插件上文的例子,做的核心事情就是把日志行轉(zhuǎn)換到 message 字段,并附加某些元數(shù)據(jù),如 @timestamp。如果要想解析自己的日志,把非結(jié)構(gòu)化日志轉(zhuǎn)換結(jié)構(gòu)換日志,有兩個(gè)過(guò)濾器特別常用:dissect 會(huì)根據(jù)分界符來(lái)解析日志,而 grok 則會(huì)根據(jù)正則表達(dá)式匹配來(lái)運(yùn)行。
如果數(shù)據(jù)結(jié)構(gòu)定義非常完善,dissect 過(guò)濾插件的運(yùn)行效果非常好,而且運(yùn)行速度非??旖莞咝?。同時(shí),其也更加容易上手,對(duì)于不熟悉正則表達(dá)式的用戶而言,更是如此。通常而言,grok 的功能更加強(qiáng)大,而且可以處理各種各樣的數(shù)據(jù)。然而,正則表達(dá)式匹配會(huì)耗費(fèi)更多資源,而且速度也會(huì)慢一些,如果未能正確進(jìn)行優(yōu)化的話,尤為如此。
現(xiàn)在先來(lái)看下 grok 過(guò)濾插件。grok 模式的基本語(yǔ)法是 %{SYNTAX:SEMANTIC},SYNTAX 是用于匹配數(shù)據(jù)的模式(或正則表達(dá)式)名稱,SEMANTIC 是標(biāo)識(shí)符或字段名稱。Logstash 提供了超過(guò) 120 種默認(rèn)的 grok 模式,全部預(yù)定義的模式可以在 github 上找到。典型的預(yù)定義模式(非完整列表) [github ]:
WORD - 匹配單個(gè)詞匯的模式
NUMBER - 匹配整數(shù)或浮點(diǎn)數(shù)(正值或負(fù)值均可)的模式
POSINT - 匹配正整數(shù)的模式
EMAILADDRESS - 郵箱地址
IP - 匹配 IPv4 或 IPv6 IP 地址的模式
URI - URI 地址
TIMESTAMP_ISO8601 - ISO8601 格式的時(shí)間
NOTSPACE - 匹配非空格的任何內(nèi)容的格式
SPACE - 匹配任何數(shù)量的連續(xù)空格的模式
DATA - 匹配任何數(shù)據(jù)類型的限定數(shù)量的模式
GREEDYDATA - 匹配剩余所有數(shù)據(jù)的格式
比如,3.44 可以使用 NUMBER 模式進(jìn)行匹配,192.168.2.104 可以使用 IP 模式。%{NUMBER:num} %{IP:client} 模式,將會(huì)用 NUMBER 模式把 3.44 識(shí)別為 num 字段,用 IP 模式把 192.168.2.104 識(shí)別為 client 字段。默認(rèn)情況識(shí)別獲得的字段值是字符串類型,grok 插件支持把類型轉(zhuǎn)換為 int 或 float。要想把 3.44 轉(zhuǎn)換為浮點(diǎn)數(shù),可以使用 %{NUMBER:num:float}。
假設(shè)有如下日志內(nèi)容:
Will, yulewei@gmail.com, 42, 1024, 3.14
grok 匹配表達(dá)式可以寫(xiě)成這樣:
%{WORD:name}, %{EMAILADDRESS:email}, %{NUMBER:num1}, %{NUMBER:num2:int}, %{NUMBER:pi:float}
即,在這一行日志中依次提取出,name、email、num1、num2 和 pi 字段。完整的 filter 過(guò)濾器配置的寫(xiě)法:
filter { grok { match => { "message" => "%{WORD:name}, %{EMAILADDRESS:email}, %{NUMBER:num1}, %{NUMBER:num2:int}, %{NUMBER:pi:float}" } } }
啟動(dòng) logstash:
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-grok-stdout.conf
控制臺(tái)將輸出:
{ "@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 提供了超過(guò) 120 種默認(rèn)的 grok 模式,基本上滿足大多數(shù)使用場(chǎng)景。若沒(méi)有符合要求的預(yù)定義的模式,可以使用 Oniguruma 語(yǔ)法指定正則表達(dá)式:
(?the pattern here)
上文中的 %{WORD:name} 和 %{EMAILADDRESS:email},等價(jià)的正則表達(dá)式的寫(xiě)法如下 [ref1, ref2 ]:
(?w+) (? [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})
調(diào)試 grok 匹配表達(dá)式容易出錯(cuò),官方提供可視化的 Grok Debugger 工具,提高調(diào)試效率。
解析 http 服務(wù)器日志現(xiàn)在來(lái)看下,真實(shí)的日志解析案例,使用 grok 過(guò)濾插件解析 http 服務(wù)器日志。通用日志格式(Common Log Format),是 http 服務(wù)器的標(biāo)準(zhǔn)的日志格式。對(duì)通用日志格式擴(kuò)展,加上額外的 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"
Apache 和 Nginx 服務(wù)器默認(rèn)的日志格式,采用的就是通用日志格式或者組合日志格式。解析這兩種日志格式,Logstash 提供預(yù)定義模式 COMMONAPACHELOG 和 COMBINEDAPACHELOG。
典型的 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 的預(yù)定義模式 COMBINEDAPACHELOG。另外,remove_field 指令用于把輸出事件中某字段刪除,示例中是 message 字段。
啟動(dòng) logstash:
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-grokhttp-stdout.conf
解析獲得的結(jié)構(gòu)化數(shù)據(jù),如下:
{ "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 過(guò)濾插件
和 grok 過(guò)濾插件使用正則表達(dá)式提取字段不同,dissect 過(guò)濾插件使用分界符切割來(lái)提取字段。由于沒(méi)有使用正則表達(dá)式,運(yùn)行速度相對(duì) grok 快很多。使用 dissect 過(guò)濾插件時(shí),需要指明提取字段的順序,還要指明這些字段之間的分界符。過(guò)濾插件會(huì)對(duì)數(shù)據(jù)進(jìn)行單次傳輸,并匹配模式中的分界符。同時(shí),過(guò)濾插件還會(huì)將分界符之間的數(shù)據(jù)分配至指定字段。過(guò)濾插件不會(huì)對(duì)所提取數(shù)據(jù)的格式進(jìn)行驗(yàn)證。
現(xiàn)在看下示例,test-dissect.log 文件內(nèi)容如下:
Will, yulewei@gmail.com, 42, 1024, 3.14
dissect 匹配規(guī)則可以寫(xiě)成這樣:
%{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 插件一樣,默認(rèn)提取的字段是字符串類型。配置文件中的 convert_datatype 指令用于將類型轉(zhuǎn)為 int 或 float。
啟動(dòng) logstash:
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-dissect-stdout.conf
輸出結(jié)果:
{ "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
上文舉的例子全部都是,輸出控制臺(tái),使用 stdout 輸出插件,沒(méi)有實(shí)用價(jià)值。Elastic Stack 的核心其實(shí)是 Elasticsearch,使用Elasticsearch 搜索和分析日志。想要將數(shù)據(jù)發(fā)送到 Elasticsearch,可以使用 elasticsearch 輸出插件。
安裝 Elasticsearch如果沒(méi)有安裝 Elasticsearch,參考官方文檔按步驟安裝。唯一要注意的是,在執(zhí)行 apt install 命令前,必須先添加 elastic 的軟件源地址,否則無(wú)法正常啟動(dòng)。核心命令如下:
$ sudo apt-get install elasticsearch # 安裝 elasticsearch $ sudo systemctl start elasticsearch.service # 系統(tǒng)服務(wù)方式啟動(dòng) 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" }
默認(rèn)情況下 elasticsearch 服務(wù)器綁定的 ip 地址是回環(huán)地址 127.0.0.1,若想綁定特定 ip 地址,可以修改 /etc/elasticsearch/elasticsearch.yml 配置文件中的 network.host 選項(xiàng):
network.host: 192.168.2.109
修改完成并重啟后,elasticsearch 服務(wù)器訪問(wèn)地址從 http://localhost:9200/ 變成 http://192.168.2.109:9200/。
輸出到 Elasticsearch現(xiàn)在來(lái)看下 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 輸出插件使用了 hosts 和 index 指令。hosts 指令,用于指定 elasticsearch 服務(wù)器的地址。而 index 指令,用于指定 elasticsearch 索引的名稱模式,該指令默認(rèn)值為 logstash-%{+YYYY.MM.dd}。在字符串內(nèi)部的 %{...},是 Logstash 字符串插值語(yǔ)法,官方稱之為 sprintf format [doc ]。+YYYY.MM.dd,用于指定 @timestamp 的格式化的格式。logstash-%{+YYYY.MM.dd},格式化后最終生成的值可能將是 logstash-2019.01.13。
啟動(dòng) logstash:
$ sudo /usr/share/logstash/bin/logstash -r -f ~/test-file-elasticsearch.conf
查看在 elasticsearch 上新創(chuàng)建的 logstash-* 索引以及從 logstash 同步過(guò)來(lái)的日志數(shù)據(jù):
$ 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。同步過(guò)來(lái)的日志記錄全部有 5 條,第 1 條日志的 message 內(nèi)容是 hello world。
使用 KibanaKibana,能夠?qū)?Elasticsearch 中的數(shù)據(jù)進(jìn)行可視化,是 Elastic Stack 的窗口。在 Ubuntu 下安裝 Kibana 可以使用下面命令:
$ sudo apt-get install kibana # 安裝 kibana,當(dāng)前最新版為 6.5.4 $ sudo systemctl start kibana.service # 系統(tǒng)服務(wù)方式啟動(dòng) kibana
默認(rèn)配置下,kibana 服務(wù)訪問(wèn)地址是 http://localhost:5601/,連接的 elasticsearch 地址是 http://localhost:9200,這兩個(gè)配置分別由 server.host 和 elasticsearch.url 控制 [doc ]。上文嘗試過(guò)把 elasticsearch 服務(wù) ip 地址綁定到 192.168.2.109?,F(xiàn)在來(lái)試下綁定 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 服務(wù)訪問(wèn)地址變成 http://192.168.2.109:5601/。
elasticsearch 服務(wù)器上存在索引 logstash-2019.01.13,要想把這個(gè)索引導(dǎo)入到 kibana,參考官方教程即可。點(diǎn)擊 Management 菜單,然后創(chuàng)建索引模式(index pattern)。索引模式可以直接為 logstash-2019.01.13,這樣匹配單個(gè)索引。若要匹配多個(gè)時(shí)間的 logstash 索引,可以使用通配符 *,比如 logstash-*。如果要匹配全部 2019 年 01 月的索引,可以寫(xiě)成 logstash-2019.01*。完成索引模式定義后,便可以在 Discover 菜單下查看索引,如圖:
使用 FilebeatFilebeat,輕量型日志采集器 [home ]。其前身是由 Logstash 作者 Jordan Sissel 開(kāi)發(fā)的 Logstash Forwarder。Logstash Forwarder 項(xiàng)目因?yàn)楹褪召?gòu)過(guò)來(lái)的 Packetbeat 項(xiàng)目功能相近,并且都是 Go 語(yǔ)言開(kāi)發(fā),就一起被整合改造為 Beats [ref ]。
我們知道,Logstash 使用 JRuby 開(kāi)發(fā),運(yùn)行依賴 JVM,會(huì)消耗較多的系統(tǒng)資源。為了減少系統(tǒng)資源(CPU、內(nèi)存和網(wǎng)絡(luò))的使用,Logstash Forwarder 改用 Go 語(yǔ)言開(kāi)發(fā)。另外,在功能上也做了精簡(jiǎn),只做單一的數(shù)據(jù)傳輸,不像 Logstash 有數(shù)據(jù)過(guò)濾能力。Logstash 類似于功能多樣的“瑞士軍刀”,能提供從多個(gè)數(shù)據(jù)源加載數(shù)據(jù)的功能,使用各種強(qiáng)大的插件來(lái)處理日志,并提供將多個(gè)來(lái)源的輸出數(shù)據(jù)進(jìn)行存儲(chǔ)的功能。簡(jiǎn)而言之,Logstash 提供數(shù)據(jù) ETL(數(shù)據(jù)的提取、變換和加載)的功能;而 Beats 是輕量級(jí)的數(shù)據(jù)傳輸工具,能將數(shù)據(jù)傳輸?shù)?Logstash 或 Elasticsearch 中,其間沒(méi)有對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換 [Gupta2017 ]。Filebeat 和 Logstash 的關(guān)系如下圖所示 [logz.io ]:
安裝 filebeat 很簡(jiǎn)單,參考官方文檔即可,核心命令如下:
$ 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 # 系統(tǒng)服務(wù)方式啟動(dòng) 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 選項(xiàng)用于配置日志的輸入方式。子選項(xiàng) type 支持 log、stdin、redis、udp、tcp 等,示例中使用了 log,表明從日志文件輸入。
output 選項(xiàng)用于配置日志的輸出方式,配置支持 elasticsearch、logstash、kafka、redis、file、console 等,一次只能選擇配置其中某一個(gè)。示例配置了 output.elasticsearch.hosts,指定日志輸出目標(biāo) elasticsearch 的主機(jī)地址。output.elasticsearch.index 可以用來(lái)指定索引 index 名稱模式,默認(rèn)是 filebeat-%{[beat.version]}-%{+yyyy.MM.dd}(比如 filebeat-6.5.4-2019.01.12) [doc ]。
完成 filebeat.yml 修改后,重啟 filebeat,將可以看到,在 elasticsearch 上新創(chuàng)建的 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 采集的日志傳輸?shù)?Elasticsearch,日志數(shù)據(jù)并沒(méi)有被解析或者轉(zhuǎn)換。若想解析和轉(zhuǎn)換日志,需要在Filebeat 和 Elasticsearch 中間引入 Logstash?,F(xiàn)在看下把日志輸出到 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,指定日志輸出目標(biāo) Logstash 的主機(jī)地址。5044 這個(gè)端口是 Logstash 用于監(jiān)聽(tīng) Filebeat 的端口。
現(xiàn)在來(lái)看下 Logstash 的管道配置文件,示例 test-beats-stdout.conf:
input { beats { port => 5044 } } output { stdout { codec => rubydebug } }
示例中,使用了 beats 輸入插件,配置的端口就 filebeat.yml 中指定的 5044。輸出插件為 stdout,即把 Logstash 采集到日志輸出到控制臺(tái)。
重啟 filebeat 和 logstash:
$ cat test.log # 查看日志文件內(nèi)容 hello world $ sudo systemctl restart filebeat.service # 重啟 filebeat $ sudo /usr/share/logstash/bin/logstash -r -f ~/test-beats-stdout.conf
控制臺(tái)輸出:
{ "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
真實(shí)場(chǎng)景下,日志文件可能分布在多臺(tái)服務(wù)器上,同一臺(tái)服務(wù)器上也可能分布著不同來(lái)源類型的日志?,F(xiàn)在我們來(lái)嘗試下,使用 Filebeat 把兩個(gè)日志文件各自采集到兩個(gè)不同的 Elasticsearch 索引中,并用 Kibana 可視化。有兩個(gè)日志文件 test-beats1.log 和 test-beats2.log,內(nèi)容如下:
$ 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 選項(xiàng),fields 選項(xiàng)用于在日志事件輸出中添加字段。添加的字段名可以任意指定,示例中名為 log_type。因?yàn)楝F(xiàn)在在 filebeat 配置中同時(shí)導(dǎo)入兩個(gè)日志文件,輸出到同一個(gè) logstash 中。使用這個(gè)額外字段是為了區(qū)分日志是來(lái)自 test-beats1.log 還是 test-beats2.log。示例中,第 1 個(gè)日志事件輸出的 log_type 字段值配置為 test1, 第 2 個(gè)日志配置為 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 } }
輸出插件同時(shí)使用了 elasticsearch 和 stdout。配置文件中的 elasticsearch 輸出插件的 index 指令被設(shè)置為 filebeat-%{[fields][log_type]}-%{+YYYY.MM.dd}。[fields][log_type] 引用的是在 filebeat.yml 的 filebeat.inputs.fields 選項(xiàng)添加的 log_type 字段(關(guān)于在配置文件引用字段的語(yǔ)法,可以參考官方文檔)。根據(jù) log_type 字段不同,把日志將輸出到不同的索引中。因?yàn)?filebeat.yml 配置文件中設(shè)置的 log_type 字段是 test1 或者 test2,所以最終生成的索引名是 filebeat-test1-* 或者 filebeat-test1-*。filebeat-test1-* 索引中全部日志數(shù)據(jù)來(lái)自 test-beats1.log 日志文件,filebeat-test2-* 索引數(shù)據(jù)來(lái)自 test-beats2.log。
啟動(dòng) filebeat 和 logstash:
$ sudo systemctl restart filebeat.service $ sudo /usr/share/logstash/bin/logstash -r -f ~/test-beats-elasticsearch.conf
控制臺(tái)輸出:
... { "@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 上新創(chuàng)建的 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 上查看收集的日志:
參考資料發(fā)展歷程| Elastic https://www.elastic.co/cn/abo...
2013-01 Welcome Drew & Rashid (Kibana) https://www.elastic.co/blog/w...
2013-08 Welcome Jordan & Logstash https://www.elastic.co/blog/w...
2015-05 Welcome Packetbeat, Tudor & Monica https://www.elastic.co/blog/w...
2015-11 The Beats 1.0.0 https://www.elastic.co/blog/b...
2016-02 Heya, Elastic Stack and X-Pack https://www.elastic.co/blog/h...
2016-10 Elastic Stack 5.0 正式發(fā)布 https://www.elastic.co/cn/blo...
2018-05 官方:Logstash 實(shí)用介紹 https://www.elastic.co/cn/blo...
Filebeat vs. Logstash — The Evolution of a Log Shipper https://logz.io/blog/filebeat...
精通Elastic Stack,Gupta,2017 https://book.douban.com/subje...
logstash - open source log management https://web.archive.org/web/2...
Logstash Config Language https://web.archive.org/web/2...
Accessing Event Data and Fields in the Configuration https://www.elastic.co/guide/...
Logstash Configuration Examples https://www.elastic.co/guide/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77424.html
摘要:簡(jiǎn)單介紹,三者組合在一起搭建實(shí)時(shí)的日志分析平臺(tái),目前好多公司都是這套是個(gè)開(kāi)源分布式搜索引擎,它的特點(diǎn)有分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制,風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。 showImg(https://segmentfault.com/img/remote/1460000012596092?w=1920&h=1270); 簡(jiǎn)單介紹 ELK(ElasticSear...
閱讀 2390·2021-11-15 11:37
閱讀 2639·2021-09-23 11:21
閱讀 2969·2021-09-07 10:11
閱讀 3176·2019-08-30 15:53
閱讀 2836·2019-08-29 15:13
閱讀 1619·2019-08-26 13:57
閱讀 1112·2019-08-26 12:23
閱讀 2453·2019-08-26 11:51