瞭解Logstash

Logstash介紹


Logstash是一個開源數據收集引擎,具有實時管道功能。Logstash可以動態地將來自不同數據源的數據統一起來,並將數據標準化到你所選擇的目的地。

瞭解Logstash

集中、轉換和存儲你的數據

如果想學習Java工程化、高性能及分佈式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋

友可以加我的Java高級交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。


Logstash是一個開源的服務器端數據處理管道,可以同時從多個數據源獲取數據,並對其進行轉換,然後將其發送到你最喜歡的“存儲”。(當然,我們最喜歡的是Elasticsearch)

輸入:採集各種樣式、大小和來源的數據

數據往往以各種各樣的形式,或分散或集中地存在於很多系統中。Logstash 支持各種輸入選擇 ,可以在同一時間從眾多常用來源捕捉事件。能夠以連續的流式傳輸方式,輕鬆地從您的日誌、指標、Web 應用、數據存儲以及各種 AWS 服務採集數據。

瞭解Logstash

過濾器:實時解析和轉換數據

數據從源傳輸到存儲庫的過程中,Logstash 過濾器能夠解析各個事件,識別已命名的字段以構建結構,並將它們轉換成通用格式,以便更輕鬆、更快速地分析和實現商業價值。

Logstash 能夠動態地轉換和解析數據,不受格式或複雜度的影響:

  • 利用 Grok 從非結構化數據中派生出結構
  • 從 IP 地址破譯出地理座標
  • 將 PII 數據匿名化,完全排除敏感字段
  • 整體處理不受數據源、格式或架構的影響
瞭解Logstash

輸出:選擇你的存儲,導出你的數據

儘管 Elasticsearch 是我們的首選輸出方向,能夠為我們的搜索和分析帶來無限可能,但它並非唯一選擇。

Logstash 提供眾多輸出選擇,您可以將數據發送到您要指定的地方,並且能夠靈活地解鎖眾多下游用例。

瞭解Logstash

安裝Logstash


瞭解Logstash

首先,讓我們通過最基本的Logstash管道來測試一下剛才安裝的Logstash

Logstash管道有兩個必需的元素,輸入和輸出,以及一個可選元素過濾器。輸入插件從數據源那裡消費數據,過濾器插件根據你的期望修改數據,輸出插件將數據寫入目的地。

瞭解Logstash

接下來,允許Logstash最基本的管道,例如:

bin/logstash -e 'input { stdin {} } output { stdout {} }'

(畫外音:選項 -e 的意思是允許你從命令行指定配置)

啟動以後,下面我們在命令行下輸入"hello world"

瞭解Logstash

用Logstash解析日誌


在上一小節中,你已經創建了一個基本的Logstash管道來測試你的Logstash設置。在現實世界中,一個Logstash管理會稍微複雜一些:它通常有一個或多個input, filteroutput 插件。

在這一小節中,你將創建一個Logstash管道,並且使用Filebeat將Apache Web日誌作為input,解析這些日誌,然後將解析的數據寫到一個Elasticsearch集群中。你將在配置文件中定義管道,而不是在命令行中定義管道配置。

在開始之前,請先下載示例數據。

如果想學習Java工程化、高性能及分佈式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋

友可以加我的Java高級交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。

配置Filebeat來發送日誌行到Logstash

在你創建Logstash管道之前,你需要先配置Filebeat來發送日誌行到Logstash。Filebeat客戶端是一個輕量級的、資源友好的工具,它從服務器上的文件中收集日誌,並將這些日誌轉發到你的Logstash實例以進行處理。Filebeat設計就是為了可靠性和低延遲。Filebeat在主機上佔用的資源很少,而且Beats input插件將對Logstash實例的資源需求降到最低。

(畫外音:注意,在一個典型的用例中,Filebeat和Logstash實例是分開的,它們分別運行在不同的機器上。在本教程中,Logstash和Filebeat在同一臺機器上運行。)

關於Filebeat請參考《開始使用Filebeat》

瞭解Logstash

第1步:配置filebeat.yml

filebeat.inputs:
- type: log
paths:
- /usr/local/programs/logstash/logstash-tutorial.log
output.logstash:
hosts: ["localhost:5044"]

第2步:在logstash安裝目錄下新建一個文件first-pipeline.conf

瞭解Logstash

(畫外音:剛才說過了通常Logstash管理有三部分(輸入、過濾器、輸出),這裡input下面beats { port => "5044" }的意思是用Beats輸入插件,而stdout { codec => rubydebug }的意思是輸出到控制檯)

第3步:檢查配置並啟動Logstash

bin/logstash -f first-pipeline.conf --config.test_and_exit

(畫外音:--config.test_and_exit選項的意思是解析配置文件並報告任何錯誤)

bin/logstash -f first-pipeline.conf --config.reload.automatic

(畫外音:--config.reload.automatic選項的意思是啟用自動配置加載,以至於每次你修改完配置文件以後無需停止然後重啟Logstash)

第4步:啟動filebeat

./filebeat -e -c filebeat.yml -d "publish"

如果一切正常,你將會在Logstash控制檯下看到類似這樣的輸出:

瞭解Logstash

用Grok過濾器插件解析日誌

現在你有了一個工作管道,可以從Filebeat讀取日誌行。但是你可能已經注意到日誌消息的格式並不理想。你想要解析日誌消息,以便從日誌中創建特定的、命名的字段。為此,您將使用grok filter插件。

如果想學習Java工程化、高性能及分佈式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型互聯網技術的視

頻免費分享給大家。

grok 過濾器插件是Logstash中默認可用的幾個插件之一。

grok 過濾器插件允許你將非結構化日誌數據解析為結構化和可查詢的數據。

因為 grok 過濾器插件在傳入的日誌數據中查找模式

為了解析數據,你可以用 %{COMBINEDAPACHELOG} grok pattern ,這種模式(或者說格式)的schema如下:

瞭解Logstash

接下來,編輯first-pipeline.conf文件,加入grok filter,在你修改完以後這個文件看起來應該是這樣的:

瞭解Logstash

在你保存完以後,因為你已經啟動了自動加載配置,所以你不需要重啟Logstash來應用你的修改。但是,你確實需要強制Filebeat從頭讀取日誌文件。為了這樣做,你需要在終端先按下Ctrl+C停掉Filebeat,然後刪除Filebeat註冊文件。例如:

rm data/registr
瞭解Logstash

然後重啟Filebeat

./filebeat -e -c filebeat.yml -d "publish"

此時,再看Logstash控制檯,輸出可能是這樣的:

瞭解Logstash

用 Geoip 過濾器插件增強你的數據

瞭解Logstash

然後,同樣地,重啟Filebeat

Ctrl+C
rm data/registry
./filebeat -e -c filebeat.yml -d "publish"

再次查看Logstash控制檯,我們會發現多了地理位置信息:

瞭解Logstash

索引你的數據到Elasticsearch

在之前的配置中,我們配置了Logstash輸出到控制檯,現在我們讓它輸出到Elasticsearch集群。

編輯first-pipeline.conf文件,替換output區域為:

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

在這段配置中,Logstash用http協議連接到Elasticsearch,而且假設Logstash和Elasticsearch允許在同一臺機器上。你也可以指定一個遠程的Elasticsearch實例,比如host=>["es-machine:9092"]

現在,first-pipeline.conf文件是這樣的:

瞭解Logstash

同樣,保存改變以後,重啟Filebeat

(畫外音:首先,Ctrl+C終止Filebeat;接著rm data/registry刪除註冊文件;最後,./filebeat -e -c filebeat.yml -d "publish" 啟動Filebeat)

好了,接下來啟動Elasticsearch

瞭解Logstash

(畫外音:查看Elasticsearch索引,如果沒有看到logstash的索引,那麼重啟Filebeat和Logstash,重啟之後應該就可以看到了)

如果一切正常的話,可以在Elasticsearch的控制檯日誌中看到這樣的輸出:

[2018-08-11T17:35:27,871][INFO ][o.e.c.m.MetaDataIndexTemplateService] [Px524Ts] adding template [logstash] for index patterns [logstash-*]
[2018-08-11T17:46:13,311][INFO ][o.e.c.m.MetaDataCreateIndexService] [Px524Ts] [logstash-2018.08.11] creating index, cause [auto(bulk api)], templates [logstash], shards [5]/[1], mappings [_default_]
[2018-08-11T17:46:13,549][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] create_mapping [doc]
[2018-08-11T17:46:13,722][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] update_mapping [doc]

這個時候,我們再查看Elasticsearch的索引

請求:

curl 'localhost:9200/_cat/indices?v'

響應:

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open bank 59jD3B4FR8iifWWjrdMzUg 5 1 1000 0 475.1kb 475.1kb
green open .kibana DzGTSDo9SHSHcNH6rxYHHA 1 0 153 23 216.8kb 216.8kb
yellow open filebeat-6.3.2-2018.08.08 otgYPvsgR3Ot-2GDcw_Upg 3 1 255 0 63.7kb 63.7kb
yellow open customer DoM-O7QmRk-6f3Iuls7X6Q 5 1 1 0 4.5kb 4.5kb
yellow open logstash-2018.08.11 pzcVdNxSSjGzaaM9Ib_G_w 5 1 100 0 251.8kb 251.8kb

可以看到有一個名字叫"logstash-2018.08.11"的索引,其它的索引都是之前建的不用管

接下來,查看這個索引下的文檔

請求:

curl -X GET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=response=200'

響應大概是這樣的:

(畫外音:由於輸出太長了,這裡截取部分)

{
"_index" : "logstash-2018.08.11",
"_type" : "doc",
"_id" : "D_JhKGUBOuOlYJNtDfwl",

"_score" : 0.070617564,
"_source" : {
"host" : {
"name" : "localhost.localdomain"
},
"httpversion" : "1.1",
"ident" : "-",
"message" : "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"",
"auth" : "-",
"timestamp" : "04/Jan/2015:05:13:42 +0000",
"input" : {
"type" : "log"
},
"geoip" : {
"postal_code" : "101194",
"region_name" : "Moscow",
"timezone" : "Europe/Moscow",
"continent_code" : "EU",
"city_name" : "Moscow",
"country_code3" : "RU",
"country_name" : "Russia",
"ip" : "83.149.9.216",
"country_code2" : "RU",
"region_code" : "MOW",
"latitude" : 55.7485,
"longitude" : 37.6184,
"location" : {
"lon" : 37.6184,
"lat" : 55.7485
}
},
"@timestamp" : "2018-08-11T09:46:10.209Z",
"offset" : 0,
"tags" : [
"beats_input_codec_plain_applied"
],
"beat" : {
"version" : "6.3.2",
"hostname" : "localhost.localdomain",
"name" : "localhost.localdomain"
},
"clientip" : "83.149.9.216",
"@version" : "1",
"verb" : "GET",
"request" : "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"prospector" : {
"type" : "log"
},
"referrer" : ""http://semicomplete.com/presentations/logstash-monitorama-2013/"",
"response" : "200",

"bytes" : "203023",
"source" : "/usr/local/programs/logstash/logstash-tutorial.log",
"agent" : ""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36""
}
}

再來一個

請求:

curl -XGET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=geoip.city_name=Buffalo'

響應:

{
"took" : 37,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 2.6855774,
"hits" : [
{
"_index" : "logstash-2018.08.11",
"_type" : "doc",
"_id" : "DvJhKGUBOuOlYJNtDPw7",
"_score" : 2.6855774,
"_source" : {
"host" : {
"name" : "localhost.localdomain"
},
"httpversion" : "1.1",
"ident" : "-",
"message" : "198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] "GET /blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1" 200 10756 "-" "Tiny Tiny RSS/1.11 (http://tt-rss.org/)"",
"auth" : "-",
"timestamp" : "04/Jan/2015:05:29:13 +0000",
"input" : {
"type" : "log"
},
"geoip" : {
"postal_code" : "14202",
"region_name" : "New York",

"timezone" : "America/New_York",
"continent_code" : "NA",
"city_name" : "Buffalo",
"country_code3" : "US",
"country_name" : "United States",
"ip" : "198.46.149.143",
"dma_code" : 514,
"country_code2" : "US",
"region_code" : "NY",
"latitude" : 42.8864,
"longitude" : -78.8781,
"location" : {
"lon" : -78.8781,
"lat" : 42.8864
}
},
"@timestamp" : "2018-08-11T09:46:10.254Z",
"offset" : 22795,
"tags" : [
"beats_input_codec_plain_applied"
],
"beat" : {
"version" : "6.3.2",
"hostname" : "localhost.localdomain",
"name" : "localhost.localdomain"
},
"clientip" : "198.46.149.143",
"@version" : "1",
"verb" : "GET",
"request" : "/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
"prospector" : {
"type" : "log"
},
"referrer" : ""-"",
"response" : "200",
"bytes" : "10756",
"source" : "/usr/local/programs/logstash/logstash-tutorial.log",
"agent" : ""Tiny Tiny RSS/1.11 (http://tt-rss.org/)""
}
},
。。。

(畫外音:關於Elasticsearch可以查看另外一篇《Elasticsearch 快速開始》)

命令行啟動Logstash


為了從命令行啟動Logstash,用下面的命令:

bin/logstash [options]

下面的例子展示了啟動Logstash,並制定配置定義在mypipeline.conf文件中:

bin/logstash -f mypipeline.conf

在命令行中設置的任何標誌都會覆蓋logstash.yml中的相應設置。但是文件本身的內容沒有改變。

如果想學習Java工程化、高性能及分佈式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型互聯網技術的視

頻免費分享給大家。

Command-Line Flags

--node.name NAME

指定Logstash實例的名字。如果沒有指定的話,默認是當前主機名。

-f, --path.config CONFIG_PATH

從指定的文件或者目錄加載Logstash配置。如果給定的是一個目錄,則該目錄中的所有文件將以字典順序連接,然後作為一個配置文件進行解析。

-e, --config.string CONFIG_STRING

用給定的字符串作為配置數據,語法和配置文件中是一樣的。

--modules

運行的模塊名字

-l, --path.logs PATH

Logstash內部日誌輸出目錄

--log.level LEVEL

日誌級別

-t, --config.test_and_exit

檢查配置語法是否正確並退出

-r, --config.reload.automatic

監視配置文件的改變,並且當配置文件被修改以後自動重新加載配置文件。

-config.reload.interval RELOAD_INTERVAL

為了檢查配置文件是否改變,而拉去配置文件的頻率。默認3秒。

--http.host HTTP_HOST

Web API綁定的主機。REST端點綁定的地址。默認是"127.0.0.1"

--http.port HTTP_PORT

Web API http端口。REST端點綁定的端口。默認是9600-9700之間。

--log.format FORMAT

指定Logstash寫它自身的使用JSON格式還是文本格式。默認是"plain"。

--path.settings SETTINGS_DIR

設置包含logstash.yml配置文件的目錄,比如log4j日誌配置。也可以設置LS_SETTINGS_DIR環境變量。默認的配置目錄是在Logstash home目錄下。

-h, --help

打印幫助

需要更多“Java”資料的同學在後臺私信回覆關鍵詞“666”獲取一份精品Java架構資料


分享到:


相關文章: