­

ELK總結——第二篇Logstash的搭建

  • 2019 年 12 月 5 日
  • 筆記

1、簡介

Elasticsearch是當前主流的分散式大數據存儲和搜索引擎,可以為用戶提供強大的全文本檢索能力,廣泛應用於日誌檢索,全站搜索等領域。Logstash作為Elasicsearch常用的實時數據採集引擎,可以採集來自不同數據源的數據,並對數據進行處理後輸出到多種輸出源,是Elastic Stack 的重要組成部分。本文從Logstash的工作原理,使用示例,部署方式及性能調優等方面入手,為大家提供一個快速入門Logstash的方式。文章最後也給出了一些深入了解Logstash的的鏈接,以方便大家根據需要詳細了解。

2、Logstash 下載與安裝

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

3、Logstash 架構

基於 Logstash 構建的日誌收集處理體系是基於消息的,整個系統分別由四個組件組成。

1.Shipper 搬運者,將事件發送到 Logstash 。一般來說在應用服務所在的機器上只需要部署該組件。

2.Broker and Indexer 收集事件並進行處理,完成如數據過濾,數據格式化等,然後傳輸到指定存儲系統或是進行在本地數據持久化等。

3.Search and Storage 用於存儲和搜索事件。

4.Web Interface 網路介面。簡單來說就是通過 Web 向用戶展示數據並提供檢索服務等。

Broker and Indexer 一般均由 Logstash 擔當,除此之外,logstash 也可以同時作為 Shipper ,可以理解為一種自收自發的模式。不過 Logstash 同時作為 Shipper 的話,就表示每台應用伺服器的機器都需要部署 Logstash 實例,比起 filebeat 這種專門用於收集發送的應用資源消耗更大(filebeat 也可以跳過 Logstash ,直接將事件傳輸到如 Elasticsearch 的存儲服務,但是 filebeat 在數據處理方面過於薄弱)。

4、Logstash工作原理

4.1處理過程

如上圖,Logstash的數據處理過程主要包括:Inputs, Filters, Outputs 三部分, 另外在Inputs和Outputs中可以使用Codecs對數據格式進行處理。這四個部分均以插件形式存在,用戶通過定義pipeline配置文件,設置需要使用的input,filter,output, codec插件,以實現特定的數據採集,數據處理,數據輸出等功能。

1.Inputs:用於從數據源獲取數據,常見的插件如file, syslog, redis, beats 等。

2.Filters:用於處理數據如格式轉換,數據派生等,常見的插件如grok, mutate, drop, clone, geoip等。

3.Outputs:用於數據輸出,常見的插件如elastcisearch,file, graphite, statsd等。

4.Codecs:Codecs不是一個單獨的流程,而是在輸入和輸出等插件中用於數據轉換的模組,用於對數據進行編碼處理,常見的插件如json,multiline。

4.2執行模型

1.每個Input啟動一個執行緒,從對應數據源獲取數據。

2.Input會將數據寫入一個隊列:默認為記憶體中的有界隊列(意外停止會導致數據丟失)。為了防止數丟失Logstash提供了兩個特性:Persistent Queues:通過磁碟上的queue來防止數據丟失 Dead Letter Queues:保存無法處理的event(僅支援Elasticsearch作為輸出源)。

3.Logstash會有多個pipeline worker, 每一個pipeline worker會從隊列中取一批數據,然後執行filter和output(worker數目及每次處理的數據量均由配置確定)。

5、典型應用場景

因為 Logstash 自身的靈活性以及網路上豐富的資料,Logstash 適用於原型驗證階段使用,或者解析非常的複雜的時候。在不考慮伺服器資源的情況下,如果伺服器的性能足夠好,我們也可以為每台伺服器安裝 Logstash 。我們也不需要使用緩衝,因為文件自身就有緩衝的行為,而 Logstash 也會記住上次處理的位置。

如果伺服器性能較差,並不推薦為每個伺服器安裝 Logstash ,這樣就需要一個輕量的日誌傳輸工具,將數據從伺服器端經由一個或多個 Logstash 中心伺服器傳輸到 Elasticsearch。

隨著日誌項目的推進,可能會因為性能或代價的問題,需要調整日誌傳輸的方式(log shipper)。當判斷 Logstash 的性能是否足夠好時,重要的是對吞吐量的需求有著準確的估計,這也決定了需要為 Logstash 投入多少硬體資源。

6、Logstash的設計非常規範,有三個組件

1.Shipper 負責日誌收集。職責是監控本地日誌文件的變化,並輸出到 Redis 快取起來。

2.Broker 可以看作是日誌集線器,可以連接多個 Shipper 和多個 Indexer。

3.Indexer 負責日誌存儲。在這個架構中會從 Redis 接收日誌,寫入到本地文件。

7、Logstash配置文件詳解

通過源碼安裝 ,相關設置放在 /usr/local/logstash/config 。/usr/local/logstash/config 下有以下文件和文件夾。

1.conf.d : 用於存儲 Logstash 相關管道配置的文件夾。以服務方式啟動的 Logstash 將會讀取該文件夾下的所有 *.conf 文件。

2.Logstash.yml: Logstash 的設置項文件。所有可以通過命令行啟動指定的參數都可以在該文件中找到並設置,包括上述提到的讀取 *.conf 文件的路徑,可以改變 path.config 來改變要讀取的 *.conf 文件的位置。

3.jvm.options: Logstash 是依賴於 JVM 運行的,可以通過改設置文件改變 JVM 的參數。

4.log4j2.properties: Logstash 應用本身用到的日誌服務(log4j)的設置項。

5.startup.options: 在 /usr/share/Logstash/bin 下有腳本 system-install ,用於安裝 Logstash 。而 startup.options 就是安裝時用到的參數。例如在安裝時會用到 java ,可以通過 startup.options 改變 java 的路徑,還有諸如應用的用戶(通過服務啟動的 Logstash 應用的用戶為 logstash),服務名等資訊。不過如果想要 startup.options 中的設置項生效,只能執行 system-install 腳本,重新安裝 Logstash 。

你的順手?點擊將是我堅持的動力,點一下即可,萬分感謝!

8、搭建Logstash並監控系統日誌(為了方便觀察Kibana已提前搭建好)

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

 [root@elasticsearch-01 ~]# java -version   java version "1.8.0_91"   Java(TM) SE Runtime Environment (build 1.8.0_91-b14)   Java HotSpot(TM) 64-BitServer VM (build 25.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 默認使用 logstash.yml 作為運行配置   [root@elasticsearch-01 config]# vim /usr/local/logstash/config/logstash.yml   41pipeline.workers: 4   130queue.type: persisted   -------------------------------------------------------------------   ##這裡需要注意的是:   1.在需要保證數據導入順序的情況下請更改配置 pipeline.workers 的值為 1。配置項 pipeline.workers 的值默認為 cpu 的核心數,當 workers 的值大於 1時,會導致處理數據的順序發生變化。   2.為保證數據的傳輸不會因為程式的意外終止而丟失,請設置 queue.type: persisted,該配置為 Logstash 使用的緩衝隊列類型,這樣配置可在重啟 Logstash 後繼續發送緩衝隊列中的數據。queue.type 的默認值為 memory (基於記憶體的)。

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查看是否收集到系統日誌

你的順手?點擊將是我堅持的動力,點一下即可,萬分感謝!

9、Logstash對比flume

雖然Flume與Logstash都是常用的日誌、數據採集組件,但它們之間還是有些區別的:兩者最初的設計目的就不太一樣。Flume本身最初設計的目的是為了把數據傳入HDFS中(並不是為了採集日誌而設計,這和Logstash有根本的區別),所以理所應當側重於數據的傳輸,程式設計師要非常清楚整個數據的路由,並且比Logstash還多了一個可靠性策略,上文中的channel就是用於持久化目的,數據除非確認傳輸到下一位置了,否則不會刪除,這一步是通過事務來控制的,這樣的設計使得可靠性非常好。相反,Logstash則明顯側重對數據的預處理,因為日誌的欄位需要大量的預處理,為解析做鋪墊。

10、總結

Logstash的配置就非常簡潔清晰,三個部分的屬性都定義好了,程式設計師自己去選擇就行,就算沒有,也可以自行開發插件,非常方便。目前大部分的情況下,Logstash使用更加廣泛,Logstash可以和ELK其他組件配合使用,開發、應用都會簡單很多,技術成熟,使用場景廣泛。