1踪央、簡介
Elasticsearch是當(dāng)前主流的分布式大數(shù)據(jù)存儲和搜索引擎抚恒,可以為用戶提供強(qiáng)大的全文本檢索能力温赔,廣泛應(yīng)用于日志檢索拄衰,全站搜索等領(lǐng)域它褪。Logstash作為Elasicsearch常用的實時數(shù)據(jù)采集引擎,可以采集來自不同數(shù)據(jù)源的數(shù)據(jù)翘悉,并對數(shù)據(jù)進(jìn)行處理后輸出到多種輸出源茫打,是Elastic Stack 的重要組成部分。本文從Logstash的工作原理妖混,使用示例老赤,部署方式及性能調(diào)優(yōu)等方面入手,為大家提供一個快速入門Logstash的方式制市。文章最后也給出了一些深入了解Logstash的的鏈接抬旺,以方便大家根據(jù)需要詳細(xì)了解。
2祥楣、Logstash 下載與安裝
請參考:https://www.elastic.co/cn/开财,選擇您喜歡的下載與安裝方式。
3误褪、Logstash 架構(gòu)
基于 Logstash 構(gòu)建的日志收集處理體系是基于消息的责鳍,整個系統(tǒng)分別由四個組件組成。
1.Shipper 搬運(yùn)者兽间,將事件發(fā)送到 Logstash 薇搁。一般來說在應(yīng)用服務(wù)所在的機(jī)器上只需要部署該組件。
2.Broker and Indexer 收集事件并進(jìn)行處理渡八,完成如數(shù)據(jù)過濾,數(shù)據(jù)格式化等传货,然后傳輸?shù)街付ù鎯ο到y(tǒng)或是進(jìn)行在本地數(shù)據(jù)持久化等屎鳍。
3.Search and Storage 用于存儲和搜索事件。
4.Web Interface 網(wǎng)絡(luò)接口问裕。簡單來說就是通過 Web 向用戶展示數(shù)據(jù)并提供檢索服務(wù)等逮壁。
Broker and Indexer 一般均由 Logstash 擔(dān)當(dāng),除此之外粮宛,logstash 也可以同時作為 Shipper 窥淆,可以理解為一種自收自發(fā)的模式卖宠。不過 Logstash 同時作為 Shipper 的話,就表示每臺應(yīng)用服務(wù)器的機(jī)器都需要部署 Logstash 實例忧饭,比起 filebeat 這種專門用于收集發(fā)送的應(yīng)用資源消耗更大(filebeat 也可以跳過 Logstash 扛伍,直接將事件傳輸?shù)饺?Elasticsearch 的存儲服務(wù),但是 filebeat 在數(shù)據(jù)處理方面過于薄弱)词裤。
4刺洒、Logstash工作原理
4.1處理過程
如上圖,Logstash的數(shù)據(jù)處理過程主要包括:Inputs, Filters, Outputs 三部分吼砂, 另外在Inputs和Outputs中可以使用Codecs對數(shù)據(jù)格式進(jìn)行處理逆航。這四個部分均以插件形式存在,用戶通過定義pipeline配置文件渔肩,設(shè)置需要使用的input因俐,filter,output, codec插件周偎,以實現(xiàn)特定的數(shù)據(jù)采集抹剩,數(shù)據(jù)處理,數(shù)據(jù)輸出等功能栏饮。
1.Inputs:用于從數(shù)據(jù)源獲取數(shù)據(jù)吧兔,常見的插件如file, syslog, redis, beats 等。
2.Filters:用于處理數(shù)據(jù)如格式轉(zhuǎn)換袍嬉,數(shù)據(jù)派生等境蔼,常見的插件如grok, mutate, drop, ?clone, geoip等。
3.Outputs:用于數(shù)據(jù)輸出伺通,常見的插件如elastcisearch箍土,file, graphite, statsd等。
4.Codecs:Codecs不是一個單獨的流程罐监,而是在輸入和輸出等插件中用于數(shù)據(jù)轉(zhuǎn)換的模塊吴藻,用于對數(shù)據(jù)進(jìn)行編碼處理,常見的插件如json弓柱,multiline沟堡。
4.2執(zhí)行模型
1.每個Input啟動一個線程,從對應(yīng)數(shù)據(jù)源獲取數(shù)據(jù)矢空。
2.Input會將數(shù)據(jù)寫入一個隊列:默認(rèn)為內(nèi)存中的有界隊列(意外停止會導(dǎo)致數(shù)據(jù)丟失)航罗。為了防止數(shù)丟失Logstash提供了兩個特性:Persistent Queues:通過磁盤上的queue來防止數(shù)據(jù)丟失 ?Dead Letter Queues:保存無法處理的event(僅支持Elasticsearch作為輸出源)。
3.Logstash會有多個pipeline worker, 每一個pipeline worker會從隊列中取一批數(shù)據(jù)屁药,然后執(zhí)行filter和output(worker數(shù)目及每次處理的數(shù)據(jù)量均由配置確定)粥血。
5、典型應(yīng)用場景
因為 Logstash 自身的靈活性以及網(wǎng)絡(luò)上豐富的資料,Logstash 適用于原型驗證階段使用复亏,或者解析非常的復(fù)雜的時候趾娃。在不考慮服務(wù)器資源的情況下,如果服務(wù)器的性能足夠好缔御,我們也可以為每臺服務(wù)器安裝 Logstash 抬闷。我們也不需要使用緩沖,因為文件自身就有緩沖的行為刹淌,而 Logstash 也會記住上次處理的位置饶氏。
如果服務(wù)器性能較差,并不推薦為每個服務(wù)器安裝 Logstash 有勾,這樣就需要一個輕量的日志傳輸工具疹启,將數(shù)據(jù)從服務(wù)器端經(jīng)由一個或多個 Logstash 中心服務(wù)器傳輸?shù)?Elasticsearch。
隨著日志項目的推進(jìn)蔼卡,可能會因為性能或代價的問題喊崖,需要調(diào)整日志傳輸?shù)姆绞?log shipper)。當(dāng)判斷 Logstash 的性能是否足夠好時雇逞,重要的是對吞吐量的需求有著準(zhǔn)確的估計荤懂,這也決定了需要為 Logstash 投入多少硬件資源。
6塘砸、Logstash的設(shè)計非常規(guī)范节仿,有三個組件
1.Shipper 負(fù)責(zé)日志收集。職責(zé)是監(jiān)控本地日志文件的變化掉蔬,并輸出到 Redis 緩存起來廊宪。
2.Broker 可以看作是日志集線器,可以連接多個 Shipper 和多個 Indexer女轿。
3.Indexer 負(fù)責(zé)日志存儲箭启。在這個架構(gòu)中會從 Redis 接收日志,寫入到本地文件蛉迹。
7傅寡、Logstash配置文件詳解
通過源碼安裝 ,相關(guān)設(shè)置放在 /usr/local/logstash/config 北救。/usr/local/logstash/config 下有以下文件和文件夾荐操。
1.conf.d : 用于存儲 Logstash 相關(guān)管道配置的文件夾。以服務(wù)方式啟動的 Logstash 將會讀取該文件夾下的所有 *.conf 文件珍策。
2.Logstash.yml: Logstash 的設(shè)置項文件淀零。所有可以通過命令行啟動指定的參數(shù)都可以在該文件中找到并設(shè)置,包括上述提到的讀取 *.conf 文件的路徑膛壹,可以改變 path.config 來改變要讀取的 *.conf 文件的位置。
3.jvm.options: Logstash 是依賴于 JVM 運(yùn)行的,可以通過改設(shè)置文件改變 JVM 的參數(shù)模聋。
4.log4j2.properties: Logstash 應(yīng)用本身用到的日志服務(wù)(log4j)的設(shè)置項肩民。
5.startup.options: 在 /usr/share/Logstash/bin 下有腳本 system-install ,用于安裝 Logstash 链方。而 startup.options 就是安裝時用到的參數(shù)持痰。例如在安裝時會用到 java ,可以通過 startup.options 改變 java 的路徑祟蚀,還有諸如應(yīng)用的用戶(通過服務(wù)啟動的 Logstash 應(yīng)用的用戶為 logstash)工窍,服務(wù)名等信息。不過如果想要 startup.options 中的設(shè)置項生效前酿,只能執(zhí)行 system-install 腳本患雏,重新安裝 Logstash 。
你的順手??點擊將是我堅持的動力罢维,點一下即可淹仑,萬分感謝!
8肺孵、搭建Logstash并監(jiān)控系統(tǒng)日志(為了方便觀察Kibana已提前搭建好)
8.1配置JAVA環(huán)境匀借,檢驗環(huán)境:java -version(已提前搭好,可以參考之前的公眾號文章)
[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)入順序的情況下請更改配置 pipeline.workers 的值為1平窘。配置項 pipeline.workers 的值默認(rèn)為 cpu 的核心數(shù)吓肋,當(dāng) workers 的值大于1時,會導(dǎo)致處理數(shù)據(jù)的順序發(fā)生變化瑰艘。
2.為保證數(shù)據(jù)的傳輸不會因為程序的意外終止而丟失是鬼,請設(shè)置 queue.type: persisted,該配置為 Logstash 使用的緩沖隊列類型磅叛,這樣配置可在重啟 Logstash 后繼續(xù)發(fā)送緩沖隊列中的數(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輸入輸出配置文件是否有錯
[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選項啟用自動配置重新加載弊琴,因此您不必在每次修改配置文件時停止并重新啟動Logstash兆龙。
8.6啟動Logstash
[root@elasticsearch-01 ~]# cd /usr/local/logstash
[root@elasticsearch-01 logstash]# nohup bin/logstash -f config/logstash.conf &
8.7查看是否收集到系統(tǒng)日志
你的順手??點擊將是我堅持的動力,點一下即可敲董,萬分感謝紫皇!
9、Logstash對比flume
雖然Flume與Logstash都是常用的日志腋寨、數(shù)據(jù)采集組件聪铺,但它們之間還是有些區(qū)別的:兩者最初的設(shè)計目的就不太一樣。Flume本身最初設(shè)計的目的是為了把數(shù)據(jù)傳入HDFS中(并不是為了采集日志而設(shè)計萄窜,這和Logstash有根本的區(qū)別)铃剔,所以理所應(yīng)當(dāng)側(cè)重于數(shù)據(jù)的傳輸撒桨,程序員要非常清楚整個數(shù)據(jù)的路由,并且比Logstash還多了一個可靠性策略键兜,上文中的channel就是用于持久化目的凤类,數(shù)據(jù)除非確認(rèn)傳輸?shù)较乱晃恢昧耍駝t不會刪除普气,這一步是通過事務(wù)來控制的谜疤,這樣的設(shè)計使得可靠性非常好。相反现诀,Logstash則明顯側(cè)重對數(shù)據(jù)的預(yù)處理夷磕,因為日志的字段需要大量的預(yù)處理,為解析做鋪墊仔沿。
10坐桩、總結(jié)
Logstash的配置就非常簡潔清晰,三個部分的屬性都定義好了于未,程序員自己去選擇就行撕攒,就算沒有,也可以自行開發(fā)插件烘浦,非常方便抖坪。目前大部分的情況下,Logstash使用更加廣泛闷叉,Logstash可以和ELK其他組件配合使用擦俐,開發(fā)、應(yīng)用都會簡單很多握侧,技術(shù)成熟蚯瞧,使用場景廣泛。