日誌收集工具簡單對比
前言:efk中的f與elk中的l分別可以指代logstash、filebeat、rsyslog、Fluentd等,作為日誌系統中的標準收集工具,各有優劣,本文將分析下各自的有點與不足。
Logstash
logstash基於JRuby實現,可以跨平台運行在JVM上
優點
主要的優點就是它的靈活性,這還主要因為它有很多插件。然後它清楚的文檔已經直白的配置格式讓它可以再多種場景下應用。這樣的良性循環讓我們可以在網上找到很多資源,幾乎可以處理任何問題。
劣勢
Logstash 致命的問題是它的性能以及資源消耗(默認的堆大小是 1GB)。儘管它的性能在近幾年已經有很大提升,與它的替代者們相比還是要慢很多的。因為logstash是jvm跑的,資源消耗比較大,所以後來作者又用golang寫了一個功能較少但是資源消耗也小的輕量級的logstash-forwarder。不過作者只是一個人,elastic.co公司以後,因為es公司本身還收購了另一個開源項目packetbeat,而這個項目專門就是用golang的,有整個團隊,所以es公司乾脆把logstash-forwarder的開發工作也合併到同一個golang團隊來搞,於是新的項目就叫filebeat了。logstash 和filebeat都具有日誌收集功能,filebeat更輕量,佔用資源更少,但logstash 具有filter功能,能過濾分析日誌。一般結構都是filebeat採集日誌,然後發送到消息隊列,redis,kafaka。然後logstash去獲取,利用filter功能過濾分析,然後存儲到elasticsearch中。
Filebeat
使用go語言編寫
工作原理:
Filebeat可以保持每個文件的狀態,並且頻繁地把文件狀態從註冊表裡更新到磁碟。這裡所說的文件狀態是用來記錄上一次Harvster讀取文件時讀取到的位置,以保證能把全部的日誌數據都讀取出來,然後發送給output。如果在某一時刻,作為output的ElasticSearch或者Logstash變成了不可用,Filebeat將會把最後的文件讀取位置保存下來,直到output重新可用的時候,快速地恢復文件數據的讀取。在Filebaet運行過程中,每個Prospector的狀態資訊都會保存在記憶體里。如果Filebeat出行了重啟,完成重啟之後,會從註冊表文件里恢復重啟之前的狀態資訊,讓FIlebeat繼續從之前已知的位置開始進行數據讀取。
Prospector會為每一個找到的文件保持狀態資訊。因為文件可以進行重命名或者是更改路徑,所以文件名和路徑不足以用來識別文件。對於Filebeat來說,都是通過實現存儲的唯一標識符來判斷文件是否之前已經被採集過。
如果在你的使用場景中,每天會產生大量的新文件,你將會發現Filebeat的註冊表文件會變得非常大
Filebeat 只是一個二進位文件沒有任何依賴。它佔用資源極少,儘管它還十分年輕,正式因為它簡單,所以幾乎沒有什麼可以出錯的地方,所以它的可靠性就比較高,當然,因為簡單,所以具有高可靠性,同樣,也因為簡單,可配置性與功能方面就不是那麼優越。
Fluentd
fluentd基於CRuby實現,並對性能表現關鍵的一些組件用C語言重新實現,整體性能不錯。
fluentd設計簡潔,pipeline內數據傳遞可靠性高。相較於logstash,其插件支援相對少一些。
開源社區中流行的日誌收集工具,所以支援相對較好
rsyslog
rsyslog 是經測試過的最快的傳輸工具。如果只是將它作為一個簡單的 router/shipper 使用,幾乎所有的機器都會受頻寬的限制,但是它非常擅長處理解析多個規則。它基於語法的模組(mmnormalize)無論規則數目如何增加,它的處理速度始終是線性增長的。這也就意味著,如果當規則在 20-30 條時,如解析 Cisco 日誌時,它的性能可以大大超過基於正則式解析的 grok ,達到 100 倍(當然,這也取決於 grok 的實現以及 liblognorm 的版本)。
它同時也是我們能找到的最輕的解析器,當然這也取決於我們配置的緩衝。
劣勢
rsyslog 的配置工作需要更大的代價(這裡有一些例子),這讓兩件事情非常困難:
文檔難以搜索和閱讀,特別是那些對術語比較陌生的開發者。
5.x 以上的版本格式不太一樣(它擴展了 syslogd 的配置格式,同時也仍然支援舊的格式),儘管新的格式可以兼容舊格式,但是新的特性(例如,Elasticsearch 的輸出)只在新的配置下才有效,然後舊的插件(例如,Postgres 輸出)只在舊格式下支援。儘管在配置穩定的情況下,rsyslog 是可靠的(它自身也提供多種配置方式,最終都可以獲得相同的結果),它還是存在一些 bug 。
logtail
阿里雲日誌服務的生產者,目前在阿里集團內部機器上運行,經過3年多時間的考驗,目前為阿里公有雲用戶提供日誌收集服務。
採用C++語言實現,對穩定性、資源控制、管理等下過很大的功夫,性能良好。相比於logstash、fluentd的社區支援,logtail功能較為單一,專註日誌收集功能。