日誌採集情境下用戶端測評
DT時代,數以億萬計的伺服器、移動終端、網路裝置每天產生海量的日誌。中心化的Tlog方案有效地解決了在完整生命週期內對日誌的消費需求,而日誌從裝置採集上雲是始於足下的第一步。
三款日誌採集工具
- Logstash
- 開源界ELK stack中的”L”,社區活躍,生態圈提供大量外掛程式支援。
- Logstash基於JRuby實現,可以跨平台運行在JVM上。
- 模組化設計,有很強的擴充性和互通性。
- Fluentd
- 開源社區中流行的日誌採集工具,td-agent已正式商用,由Treasure Data公司維護,是本文選用的評測版本。
- Fluentd基於CRuby實現,並對效能表現的一些關鍵組件用C語言重新實現,整體效能不錯。
- Fluentd設計簡潔,pipeline內資料傳遞可靠性高。
- 相較於Logstash,其外掛程式支援相對少一些。
- Logtail
- 阿里雲Log Service的生產者,經過多年阿里集團巨量資料情境考驗。
- 採用C++語言實現,在穩定性、資源控制、管理等方面表現較好,效能良好。
- 相比於Logstash、Fluentd的社區支援,Logtail功能較為單一,專註日誌採集功能。
功能對比
功能項 | Logstash | Fluentd | Logtail |
日誌讀取 | 輪詢 | 輪詢 | 事件觸發 |
檔案輪轉 | 支援 | 支援 | 支援 |
Failover處理 (本地checkpoint) | 支援 | 支援 | 支援 |
通用日誌解析 | 支援grok(基於Regex)解析 | 支援Regex解析 | 支援Regex解析 |
特定日誌類型 | 支援delimiter、key-value、json等主流格式 | 支援delimiter、key-value、json等主流格式 | 支援delimiter、key-value、json等主流格式 |
資料發送壓縮 | 外掛程式支援 | 外掛程式支援 | LZ4 |
資料過濾 | 支援 | 支援 | 支援 |
資料buffer發送 | 外掛程式支援 | 外掛程式支援 | 支援 |
發送異常處理 | 外掛程式支援 | 外掛程式支援 | 支援 |
運行環境 | JRuby實現,依賴JVM環境 | CRuby、C實現,依賴Ruby環境 | C++實現,無特殊要求 |
線程支援 | 支援多線程 | 多線程受GIL限制 | 支援多線程 |
熱升級 | 不支援 | 不支援 | 支援 |
中心化組態管理 | 不支援 | 不支援 | 支援 |
運行狀態自檢 | 不支援 | 不支援 | 支援cpu/記憶體閾值保護 |
記錄檔採集情境-效能對比
以Nginx的access log為範例,如下一條日誌365位元組,結構化成14個欄位:
在下面的測試中,將類比不同的壓力將該日誌重複寫入檔案,每條日誌的time欄位取當前系統時間,其它13個欄位相同。相比於實際情境,類比情境在日誌解析上並無差異,有一點區別是:較高的資料壓縮率會減少網路寫出流量。
Logstash
logstash-2.0.0版本,通過grok解析日誌並寫出到kafka(內建外掛程式,開啟gzip壓縮)。
日誌解析配置:
grok {
patterns_dir=>"/home/admin/workspace/survey/logstash/patterns"
match=>{ "message"=>"%{IPORHOST:ip} %{USERNAME:rt} - \[%{HTTPDATE:time}\] \"%{WORD:method} %{DATA:url}\" %{NUMBER:status} %{NUMBER:size} \"%{DATA:ref}\" \"%{DATA:agent}\" \"%{DATA:cookie_unb}\" \"%{DATA:cookie_cookie2}\" \"%{DATA:monitor_traceid}\" %{WORD:cell} %{WORD:ups} %{BASE10NUM:remote_port}" }
remove_field=>["message"]
}
測試結果:
寫入TPS | 寫入流量(KB/s) | CPU使用率(%) | 記憶體使用量(MB) |
500 | 178.22 | 22.4 | 427 |
1000 | 356.45 | 46.6 | 431 |
5000 | 1782.23 | 221.1 | 440 |
10000 | 3564.45 | 483.7 | 450 |
Fluentd
td-agent-2.2.1版本,通過Regex解析日誌並寫入kafka(第三方外掛程式fluent-plugin-kafka,開啟gzip壓縮)。
日誌解析配置:
<source>
type tail
format /^(?<ip>\S+)\s(?<rt>\d+)\s-\s\[(?<time>[^\]]*)\]\s"(?<url>[^\"]+)"\s(?<status>\d+)\s(?<size>\d+)\s"(?<ref>[^\"]+)"\s"(?<agent>[^\"]+)"\s"(?<cookie_unb>\d+)"\s"(?<cookie_cookie2>\w+)"\s"(?
<monitor_traceid>\w+)"\s(?<cell>\w+)\s(?<ups>\w+)\s(?<remote_port>\d+).*$/
time_format %d/%b/%Y:%H:%M:%S %z
path /home/admin/workspace/temp/mock_log/access.log
pos_file /home/admin/workspace/temp/mock_log/nginx_access.pos
tag nginx.access
</source>
測試結果:
寫入TPS | 寫入流量(KB/s) | CPU使用率(%) | 記憶體使用量(MB) |
500 | 178.22 | 13.5 | 61 |
1000 | 356.45 | 23.4 | 61 |
5000 | 1782.23 | 94.3 | 103 |
說明 受GIL限制,Fluentd單進程最多使用1個cpu核,可以使用外掛程式multiprocess以多進程的形式支援更大的日誌吞吐。
Logtail
logtail 0.9.4版本,設定Regex進行日誌結構化,資料LZ4壓縮後以HTTP協議寫到阿里雲Log Service,設定batch_size為4000條。
日誌解析配置:
logRegex : (\S+)\s(\d+)\s-\s\[([^]]+)]\s"([^"]+)"\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)"\s"(\d+)"\s"(\w+)"\s"(\w+)"\s(\w+)\s(\w+)\s(\d+).*
keys : ip,rt,time,url,status,size,ref,agent,cookie_unb,cookie_cookie2,monitor_traceid,cell,ups,remote_port
timeformat : %d/%b/%Y:%H:%M:%S
測試結果:
寫入TPS | 寫入流量(KB/s) | CPU使用率(%) | 記憶體使用量(MB) |
500 | 178.22 | 1.7 | 13 |
1000 | 356.45 | 3 | 15 |
5000 | 1782.23 | 15.3 | 23 |
10000 | 3564.45 | 31.6 | 25 |
單核處理能力對
總結
可以看到三款日誌工具各有特點:
- Logstash支援所有主流日誌類型,外掛程式支援最豐富,可以靈活DIY,但效能較差,JVM容易導致記憶體使用量量高。
- Fluentd支援所有主流日誌類型,外掛程式支援較多,效能表現較好。
- Logtail佔用機器CPU/記憶體資源最少,效能輸送量較好,針對常用日誌情境支援全面,但缺少外掛程式等機制,靈活性和可擴充性不如以上兩個用戶端。