日志收集工具簡單對比


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 只是一個二進制文件沒有任何依賴。它占用資源極少,盡管它還十分年輕,正式因為它簡單,所以幾乎沒有什么可以出錯的地方,所以它的可靠性還是很高的。它也為我們提供了很多可以調節的點,例如:它以何種方式搜索新的文件,以及當文件有一段時間沒有發生變化時,何時選擇關閉文件句柄。開始時,它只能將日志發送到 Logstash 和 Elasticsearch,而現在它可以將日志發送給 Kafka 和 Redis,在 5.x 版本中,它還具備過濾的能力。這也就意味着可以將數據直接用 Filebeat 推送到 Elasticsearch,並讓 Elasticsearch 既做解析的事情,又做存儲的事情。也不需要使用緩沖,因為 Filebeat 也會和 Logstash 一樣記住上次讀取的偏移。

filebeat只需要10來M內存資源;
典型應用場景
Filebeat 在解決某些特定的問題時:日志存於文件,我們希望
將日志直接傳輸存儲到 Elasticsearch。這僅在我們只是抓去(grep)它們或者日志是存於 JSON 格式(Filebeat 可以解析 JSON)。或者如果打算使用 Elasticsearch 的 Ingest 功能對日志進行解析和豐富。
將日志發送到 Kafka/Redis。所以另外一個傳輸工具(例如,Logstash 或自定義的 Kafka 消費者)可以進一步豐富和轉發。這里假設選擇的下游傳輸工具能夠滿足我們對功能和性能的要求

Flume

Flume 是Apache旗下使用JRuby來構建,所以依賴Java運行環境。Flume本身最初設計的目的是為了把數據傳入HDFS中(並不是為了采集日志而設計,這和Logstash有根本的區別.

Flume設計成一個分布式的管道架構,可以看作在數據源和目的地之間有一個Agent的網絡,支持數據路由。

每一個agent都由Source,Channel和Sink組成。

Source:Source負責接收輸入數據,並將數據寫入管道。Flume的Source支持HTTP,JMS,RPC,NetCat,Exec,Spooling Directory。其中Spooling支持監視一個目錄或者文件,解析其中新生成的事件。

Channel:Channel 存儲,緩存從source到Sink的中間數據。可使用不同的配置來做Channel,例如內存,文件,JDBC等。使用內存性能高但不持久,有可能丟數據。使用文件更可靠,但性能不如內存。

Sink:Sink負責從管道中讀出數據並發給下一個Agent或者最終的目的地。Sink支持的不同目的地種類包括:HDFS,HBASE,Solr,ElasticSearch,File,Logger或者其它的Flume Agent。

優勢

Flume已經可以支持一個Agent中有多個不同類型的channel和sink,我們可以選擇把Source的數據復制,分發給不同的目的端口,比如:

Flume還自帶了分區和攔截器功能,因此不是像很多實驗者認為的沒有過濾功能

缺點

Luentd和其插件都是由Ruby開發

Logagent

優勢

可以獲取 /var/log 下的所有信息,解析各種格式(Elasticsearch,Solr,MongoDB,Apache HTTPD等等),它可以掩蓋敏感的數據信息,例如,個人驗證信息(PII),出生年月日,信用卡號碼,等等。它還可以基於 IP 做 GeoIP 豐富地理位置信息(例如,access logs)。同樣,它輕量又快速,可以將其置入任何日志塊中。在新的 2.0 版本中,它以第三方 node.js 模塊化方式增加了支持對輸入輸出的處理插件。重要的是 Logagent 有本地緩沖,所以不像 Logstash ,在數據傳輸目的地不可用時會丟失日志。

劣勢

盡管 Logagent 有些比較有意思的功能(例如,接收 Heroku 或 CloudFoundry 日志),但是它並沒有 Logstash 靈活。

典型應用場景

Logagent 作為一個可以做所有事情的傳輸工具是值得選擇的(提取、解析、緩沖和傳輸)。

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

syslog-ng

可以將 syslog-ng 當作 rsyslog 的替代品(盡管歷史上它們是兩種不同的方式)。它也是一個模塊化的 syslog 守護進程,但是它可以做的事情要比 syslog 多。它可以接收磁盤緩沖並將 Elasticsearch HTTP 作為輸出。它使用 PatternDB 作為語法解析的基礎,作為 Elasticsearch 的傳輸工具,它是一個不錯的選擇。
優勢
和 rsyslog 一樣,作為一個輕量級的傳輸工具,它的性能也非常好。它曾經比 rsyslog 慢很多,但是 2 年前能達到 570K Logs/s 的性能並不差。並不像 rsyslog ,它有着明確一致的配置格式以及完好的文檔。
劣勢
Linux 發布版本轉向使用 rsyslog 的原因是 syslog-ng 高級版曾經有很多功能在開源版中都存在,但是后來又有所限制。我們這里只關注與開源版本,所有的日志傳輸工具都是開源的。現在又有所變化,例如磁盤緩沖,曾經是高級版存在的特性,現在開源版也有。但有些特性,例如帶有應用層的通知的可靠傳輸協議(reliable delivery protocol)還沒有在開源版本中。

logtail

阿里雲日志服務的生產者,目前在阿里集團內部機器上運行,經過3年多時間的考驗,目前為阿里公有雲用戶提供日志收集服務。

采用C++語言實現,對穩定性、資源控制、管理等下過很大的功夫,性能良好。相比於logstash、fluentd的社區支持,logtail功能較為單一,專注日志收集功能。

Flume LogStash Fluentd Kafka Filebeta Apache Chukwa
版本 1.8.0 6.3 6.3
開發語言 Java1.8 JRuby CRuby Java go
簡介 JSON作為數據格式。,易於解析 一個成熟的高性能消息隊列 輕量級的日志傳輸工具,支持對接logstash,elsearch。 性能非常好,部署簡單 活躍度很低
成本 開源 免費 開源 開源 開源 開源
架構 Agent由source,channel、sink組成。多個Agent可以組成調用鏈 input、Filter、output組成。 Input:完成輸入數據的讀取,由source部分配置 Parser:解析插件 Output:完成輸出數據的操作,由match部分配置 Formatter:消息格式化的插件,屬於filter類型 Buffer:緩存插件,用於緩存數據 Filebeta
容錯性 優秀,消息發送事務和重試、下游崩潰時消息磁盤存檔 假如 Logstash 節點發生故障,Logstash 會通過持久化隊列來保證運行中的事件至少一次被送達(at-least-once delivery)。那些未被正常處理的消息會被送往死信隊列(dead letter queue)以便做進一步處理。由於具備了這種吸收吞吐量的能力,現在您無需采用額外的隊列層,Logstash 就能平穩度過高峰期 緩沖,負載平衡,超時和重試的支持。 優秀
負載均衡 支持sink端故障轉移和負載均衡策略,博客 支持 支持 支持 支持
性能拓展 單個Agent配置多個sink提高性能 比較注重性能的地方采用C編寫 高性能,高吞吐量
功能拓展 1. 可以下載源代碼拓展 2.支持開發插件 ruby拓展開發插件 需要自己開發各種采集端
采集插件 Exec、JMS、Directory、 Tail、Syslog、Http、自定義 file、syslog、http、kafka、snmp、rabbitmq 多種,支持SNMP 適用於文件日志的采集端,替代 logstash-input-file 。
緩存隊列(緩存通道) Memory、Jdbc、Kafka、File、自定義 無,只發送至Redis或Kafka 支持緩存通道 本身有一個很好的存儲機制,支持內存和磁盤可靠性
日志過濾 需要自定義采集插件實現日志過濾 多種Filter插件:grok、json、drop、mutate、date、clone等,支持結構化解析文本、事件克隆、丟棄、字段轉換 支持多種過濾插件和解析插件
發送插件 HDFS、Hive、File、Null、Hbase、Kafka、Http、自定義 多種 多種
性能 Flume1.4報告 logstash及filebeat內存占用對比 Logstash性能優化 測試
缺點 沒有snmp插件 性能和資源消耗較大。推薦logbeat采集數據,Logstash過濾日志。日志的容錯性沒有flume和fluentd號 輸入輸出插件沒有logstash靈活。中文文檔較少 沒有可用的采集插件,更多的是用作消息緩存和轉發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM