ELK總結(jié)—第二篇Logstash的搭建

1、簡(jiǎn)介

Elasticsearch是當(dāng)前主流的分布式大數(shù)據(jù)存儲(chǔ)和搜索引擎,可以為用戶(hù)提供強(qiáng)大的全文本檢索能力,廣泛應(yīng)用于日志檢索,全站搜索等領(lǐng)域。Logstash作為Elasicsearch常用的實(shí)時(shí)數(shù)據(jù)采集引擎,可以采集來(lái)自不同數(shù)據(jù)源的數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行處理后輸出到多種輸出源,是Elastic Stack 的重要組成部分。本文從Logstash的工作原理,使用示例,部署方式及性能調(diào)優(yōu)等方面入手,為大家提供一個(gè)快速入門(mén)Logstash的方式。文章最后也給出了一些深入了解Logstash的的鏈接,以方便大家根據(jù)需要詳細(xì)了解。

2、Logstash 下載與安裝

請(qǐng)參考:https://www.elastic.co/cn/,選擇您喜歡的下載與安裝方式。

3、Logstash 架構(gòu)

基于 Logstash 構(gòu)建的日志收集處理體系是基于消息的,整個(gè)系統(tǒng)分別由四個(gè)組件組成。

1.Shipper 搬運(yùn)者,將事件發(fā)送到 Logstash 。一般來(lái)說(shuō)在應(yīng)用服務(wù)所在的機(jī)器上只需要部署該組件。

2.Broker and Indexer 收集事件并進(jìn)行處理,完成如數(shù)據(jù)過(guò)濾,數(shù)據(jù)格式化等,然后傳輸?shù)街付ù鎯?chǔ)系統(tǒng)或是進(jìn)行在本地?cái)?shù)據(jù)持久化等。

3.Search and Storage 用于存儲(chǔ)和搜索事件。

4.Web Interface 網(wǎng)絡(luò)接口。簡(jiǎn)單來(lái)說(shuō)就是通過(guò) Web 向用戶(hù)展示數(shù)據(jù)并提供檢索服務(wù)等。

Broker and Indexer 一般均由 Logstash 擔(dān)當(dāng),除此之外,logstash 也可以同時(shí)作為 Shipper ,可以理解為一種自收自發(fā)的模式。不過(guò) Logstash 同時(shí)作為 Shipper 的話(huà),就表示每臺(tái)應(yīng)用服務(wù)器的機(jī)器都需要部署 Logstash 實(shí)例,比起 filebeat 這種專(zhuān)門(mén)用于收集發(fā)送的應(yīng)用資源消耗更大(filebeat 也可以跳過(guò) Logstash ,直接將事件傳輸?shù)饺?Elasticsearch 的存儲(chǔ)服務(wù),但是 filebeat 在數(shù)據(jù)處理方面過(guò)于薄弱)。

4、Logstash工作原理

4.1處理過(guò)程

如上圖,Logstash的數(shù)據(jù)處理過(guò)程主要包括:Inputs, Filters, Outputs 三部分, 另外在Inputs和Outputs中可以使用Codecs對(duì)數(shù)據(jù)格式進(jìn)行處理。這四個(gè)部分均以插件形式存在,用戶(hù)通過(guò)定義pipeline配置文件,設(shè)置需要使用的input,filter,output, codec插件,以實(shí)現(xiàn)特定的數(shù)據(jù)采集,數(shù)據(jù)處理,數(shù)據(jù)輸出等功能。

1.Inputs:用于從數(shù)據(jù)源獲取數(shù)據(jù),常見(jiàn)的插件如file, syslog, redis, beats 等。

2.Filters:用于處理數(shù)據(jù)如格式轉(zhuǎn)換,數(shù)據(jù)派生等,常見(jiàn)的插件如grok, mutate, drop, ?clone, geoip等。

3.Outputs:用于數(shù)據(jù)輸出,常見(jiàn)的插件如elastcisearch,file, graphite, statsd等。

4.Codecs:Codecs不是一個(gè)單獨(dú)的流程,而是在輸入和輸出等插件中用于數(shù)據(jù)轉(zhuǎn)換的模塊,用于對(duì)數(shù)據(jù)進(jìn)行編碼處理,常見(jiàn)的插件如json,multiline。

4.2執(zhí)行模型

1.每個(gè)Input啟動(dòng)一個(gè)線(xiàn)程,從對(duì)應(yīng)數(shù)據(jù)源獲取數(shù)據(jù)。

2.Input會(huì)將數(shù)據(jù)寫(xiě)入一個(gè)隊(duì)列:默認(rèn)為內(nèi)存中的有界隊(duì)列(意外停止會(huì)導(dǎo)致數(shù)據(jù)丟失)。為了防止數(shù)丟失Logstash提供了兩個(gè)特性:Persistent Queues:通過(guò)磁盤(pán)上的queue來(lái)防止數(shù)據(jù)丟失 ?Dead Letter Queues:保存無(wú)法處理的event(僅支持Elasticsearch作為輸出源)。

3.Logstash會(huì)有多個(gè)pipeline worker, 每一個(gè)pipeline worker會(huì)從隊(duì)列中取一批數(shù)據(jù),然后執(zhí)行filter和output(worker數(shù)目及每次處理的數(shù)據(jù)量均由配置確定)。

5、典型應(yīng)用場(chǎng)景

因?yàn)?Logstash 自身的靈活性以及網(wǎng)絡(luò)上豐富的資料,Logstash 適用于原型驗(yàn)證階段使用,或者解析非常的復(fù)雜的時(shí)候。在不考慮服務(wù)器資源的情況下,如果服務(wù)器的性能足夠好,我們也可以為每臺(tái)服務(wù)器安裝 Logstash 。我們也不需要使用緩沖,因?yàn)槲募陨砭陀芯彌_的行為,而 Logstash 也會(huì)記住上次處理的位置。

如果服務(wù)器性能較差,并不推薦為每個(gè)服務(wù)器安裝 Logstash ,這樣就需要一個(gè)輕量的日志傳輸工具,將數(shù)據(jù)從服務(wù)器端經(jīng)由一個(gè)或多個(gè) Logstash 中心服務(wù)器傳輸?shù)?Elasticsearch。

隨著日志項(xiàng)目的推進(jìn),可能會(huì)因?yàn)樾阅芑虼鷥r(jià)的問(wèn)題,需要調(diào)整日志傳輸?shù)姆绞?log shipper)。當(dāng)判斷 Logstash 的性能是否足夠好時(shí),重要的是對(duì)吞吐量的需求有著準(zhǔn)確的估計(jì),這也決定了需要為 Logstash 投入多少硬件資源。

6、Logstash的設(shè)計(jì)非常規(guī)范,有三個(gè)組件

1.Shipper 負(fù)責(zé)日志收集。職責(zé)是監(jiān)控本地日志文件的變化,并輸出到 Redis 緩存起來(lái)。

2.Broker 可以看作是日志集線(xiàn)器,可以連接多個(gè) Shipper 和多個(gè) Indexer。

3.Indexer 負(fù)責(zé)日志存儲(chǔ)。在這個(gè)架構(gòu)中會(huì)從 Redis 接收日志,寫(xiě)入到本地文件。

7、Logstash配置文件詳解

通過(guò)源碼安裝 ,相關(guān)設(shè)置放在 /usr/local/logstash/config 。/usr/local/logstash/config 下有以下文件和文件夾。

1.conf.d : 用于存儲(chǔ) Logstash 相關(guān)管道配置的文件夾。以服務(wù)方式啟動(dòng)的 Logstash 將會(huì)讀取該文件夾下的所有 *.conf 文件。

2.Logstash.yml: Logstash 的設(shè)置項(xiàng)文件。所有可以通過(guò)命令行啟動(dòng)指定的參數(shù)都可以在該文件中找到并設(shè)置,包括上述提到的讀取 *.conf 文件的路徑,可以改變 path.config 來(lái)改變要讀取的 *.conf 文件的位置。

3.jvm.options: Logstash 是依賴(lài)于 JVM 運(yùn)行的,可以通過(guò)改設(shè)置文件改變 JVM 的參數(shù)。

4.log4j2.properties: Logstash 應(yīng)用本身用到的日志服務(wù)(log4j)的設(shè)置項(xiàng)。

5.startup.options: 在 /usr/share/Logstash/bin 下有腳本 system-install ,用于安裝 Logstash 。而 startup.options 就是安裝時(shí)用到的參數(shù)。例如在安裝時(shí)會(huì)用到 java ,可以通過(guò) startup.options 改變 java 的路徑,還有諸如應(yīng)用的用戶(hù)(通過(guò)服務(wù)啟動(dòng)的 Logstash 應(yīng)用的用戶(hù)為 logstash),服務(wù)名等信息。不過(guò)如果想要 startup.options 中的設(shè)置項(xiàng)生效,只能執(zhí)行 system-install 腳本,重新安裝 Logstash 。

你的順手??點(diǎn)擊將是我堅(jiān)持的動(dòng)力,點(diǎn)一下即可,萬(wàn)分感謝!

8、搭建Logstash并監(jiān)控系統(tǒng)日志(為了方便觀(guān)察Kibana已提前搭建好)

8.1配置JAVA環(huán)境,檢驗(yàn)環(huán)境:java -version(已提前搭好,可以參考之前的公眾號(hào)文章)

[root@elasticsearch-01 ~]# java -version

java version"1.8.0_91"

Java(TM) SE Runtime Environment (build1.8.0_91-b14)

Java HotSpot(TM)64-BitServer VM (build25.91-b14, mixed mode)

8.2安裝Logstash

[root@elasticsearch-01 opt]# ls

elasticsearch-6.8.5.tar.gz ? ? ? ? kibana-6.8.5-linux-x86_64.tar.gz

filebeat-6.8.5-linux-x86_64.tar.gz logstash-6.8.5.tar.gz

[root@elasticsearch-01 opt]# tar -xzvf logstash-6.8.5.tar.gz -C /usr/local/

[root@elasticsearch-01 opt]# cd /usr/local/

[root@elasticsearch-01 local]# ln -s logstash-6.8.5 logstash

8.3修改配置文件

##Logstash 默認(rèn)使用 logstash.yml 作為運(yùn)行配置

[root@elasticsearch-01 config]# vim /usr/local/logstash/config/logstash.yml

41pipeline.workers:4

130queue.type: persisted

-------------------------------------------------------------------

##這里需要注意的是:

1.在需要保證數(shù)據(jù)導(dǎo)入順序的情況下請(qǐng)更改配置 pipeline.workers 的值為1。配置項(xiàng) pipeline.workers 的值默認(rèn)為 cpu 的核心數(shù),當(dāng) workers 的值大于1時(shí),會(huì)導(dǎo)致處理數(shù)據(jù)的順序發(fā)生變化。

2.為保證數(shù)據(jù)的傳輸不會(huì)因?yàn)槌绦虻囊馔饨K止而丟失,請(qǐng)?jiān)O(shè)置 queue.type: persisted,該配置為 Logstash 使用的緩沖隊(duì)列類(lèi)型,這樣配置可在重啟 Logstash 后繼續(xù)發(fā)送緩沖隊(duì)列中的數(shù)據(jù)。queue.type 的默認(rèn)值為 memory (基于內(nèi)存的)。

8.4配置Logstash 輸入輸出

[root@elasticsearch-01 config]# cp logstash-sample.conf logstash.conf

[root@elasticsearch-01 config]# vim logstash.conf

# Sample Logstash configuration for creating a simple

# Beats -> Logstash -> Elasticsearch pipeline.

input {

? file {

path=>"/var/log/messages"

type=>"systemlog"

start_position=>"beginning"

stat_interval=>"3"

? }

? file {

path=>"/var/log/secure"

type=>"securelog"

start_position=>"beginning"

stat_interval=>"3"

? }

}

output {

if[type]=="systemlog"{

? ? ? elasticsearch {

hosts=> ["172.17.120.11:9200"]

index=>"system-log-%{+YYYY.MM.dd}"

? ? ? }

? }

if[type]=="securelog"{

? ? ? elasticsearch {

hosts=> ["172.17.120.11:9200"]

index=>"secure-log-%{+YYYY.MM.dd}"

? ? ? }

? }

}

8.5配置Logstash輸入輸出配置文件是否有錯(cuò)

[root@elasticsearch-01 ~]# /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf --config.reload.automatic

[2019-12-03T08:30:33,868][INFO ][logstash.pipeline ? ? ? ] Pipeline started successfully {:pipeline_id=>"main",:thread=>"#<Thread:0x617e6cb4 run>"}

[2019-12-03T08:30:33,944][INFO ][filewatch.observingtail ] START, creating Discoverer, Watch with file and sincedb collections

[2019-12-03T08:30:33,948][INFO ][filewatch.observingtail ] START, creating Discoverer, Watch with file and sincedb collections

[2019-12-03T08:30:33,985][INFO ][logstash.agent ? ? ? ? ? ] Pipelines running {:count=>1,:running_pipelines=>[:main],:non_running_pipelines=>[]}

[2019-12-03T08:30:34,405][INFO ][logstash.agent ? ? ? ? ? ] Successfully started Logstash API endpoint {:port=>9600}

-------------------------------------------------------------------

##該–config.reload.automatic選項(xiàng)啟用自動(dòng)配置重新加載,因此您不必在每次修改配置文件時(shí)停止并重新啟動(dòng)Logstash。

8.6啟動(dòng)Logstash

[root@elasticsearch-01 ~]# cd /usr/local/logstash

[root@elasticsearch-01 logstash]# nohup bin/logstash -f config/logstash.conf &

8.7查看是否收集到系統(tǒng)日志

你的順手??點(diǎn)擊將是我堅(jiān)持的動(dòng)力,點(diǎn)一下即可,萬(wàn)分感謝!

9、Logstash對(duì)比f(wàn)lume

雖然Flume與Logstash都是常用的日志、數(shù)據(jù)采集組件,但它們之間還是有些區(qū)別的:兩者最初的設(shè)計(jì)目的就不太一樣。Flume本身最初設(shè)計(jì)的目的是為了把數(shù)據(jù)傳入HDFS中(并不是為了采集日志而設(shè)計(jì),這和Logstash有根本的區(qū)別),所以理所應(yīng)當(dāng)側(cè)重于數(shù)據(jù)的傳輸,程序員要非常清楚整個(gè)數(shù)據(jù)的路由,并且比Logstash還多了一個(gè)可靠性策略,上文中的channel就是用于持久化目的,數(shù)據(jù)除非確認(rèn)傳輸?shù)较乱晃恢昧?,否則不會(huì)刪除,這一步是通過(guò)事務(wù)來(lái)控制的,這樣的設(shè)計(jì)使得可靠性非常好。相反,Logstash則明顯側(cè)重對(duì)數(shù)據(jù)的預(yù)處理,因?yàn)槿罩镜淖侄涡枰罅康念A(yù)處理,為解析做鋪墊。

10、總結(jié)

Logstash的配置就非常簡(jiǎn)潔清晰,三個(gè)部分的屬性都定義好了,程序員自己去選擇就行,就算沒(méi)有,也可以自行開(kāi)發(fā)插件,非常方便。目前大部分的情況下,Logstash使用更加廣泛,Logstash可以和ELK其他組件配合使用,開(kāi)發(fā)、應(yīng)用都會(huì)簡(jiǎn)單很多,技術(shù)成熟,使用場(chǎng)景廣泛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容