高效能日誌採集工具 logpipe 簡單介紹
在叢集化環境裡,日誌採集是重要基礎設施。本文結合最新的 1.0.9 版,對 logpipe 做一個簡單的介紹。開源主流解決方案是基於 flume-ng,但在實際使用中發現 flume-ng 存在諸多問題。
比如 flume-ng 的 spoolDir 採集器只能對檔名轉檔後的大小不能變化的最終日誌檔案進行採集,不能滿足採集時效性要求,如果要採集正在被不斷追加的日誌檔案,只能用 exec 採集器搭配 tail -F 命令,但 tail -F 命令又不能通配目標目錄中將來新增的未知檔名。其它解決方案如 logstash 由於是 JAVA 開發,記憶體佔用和效能都不能達到最優。
作為一個日誌採集的本地代理,記憶體佔用應該小而受控,效能應該高效,耗費 CPU 低對應用影響儘可能小,要能非同步實時追蹤日誌檔案增長,某些應用會在目標目錄下產生多個日誌檔案甚至現在不能確定將來的日誌檔名,架構上要支援多輸入多輸出流式日誌採集傳輸,為了達成以上需求,我研究了所需技術,評估實現難度並不高,就自研了 logpipe。
logpipe 是一個分散式、高可用的用於採集、傳輸、對接落地的日誌工具,採用了外掛風格的框架結構設計,支援多輸入多輸出按需配置元件用於流式日誌收集架構,無第三方依賴。
logpipe 的一種用法是能非同步實時監控叢集裡的所有日誌目錄,一旦有檔案新增或追加寫,立即採集並傳輸到大儲存上以相同日誌檔名合併落地,或者寫入 HDFS。非同步意味著不影響應用輸出日誌的效能,實時意味著一有日誌立即採集,很多日誌採集工具如 flume-ng、logstash 介紹文件通篇不提採集方式是否實時還是週期性的,這很關鍵。
logpipe 概念樸實、使用方便、配置簡練,沒有如 sink 等一大堆新名詞。
logpipe 由若干個 input、事件匯流排和若干個 output 組成。啟動 logpipe 管理程序 (monitor),派生一個工作程序 (worker),監控工作程序崩潰則重啟工作程序。工作程序裝載配置載入若干個 input 外掛和若干個 output 外掛,進入事件迴圈,任一 input 外掛產生訊息後輸出給所有 output 外掛。
logpipe 自帶了幾個外掛,分別是:
- logpipe-input-file 用 inotify 非同步實時監控日誌目錄,一旦有檔案新建或檔案增長事件發生(注意:不是週期性輪詢檔案修改時間和大小),立即捕獲檔名和讀取檔案追加資料。該外掛擁有檔案大小轉檔功能,用以替代應用日誌庫對應功能,提高應用日誌庫寫日誌效能。該外掛支援資料壓縮。
- logpipe-output-file 一旦輸入外掛有訊息產生後用相同的檔名落地檔案資料。該外掛支援資料解壓。
- logpipe-input-tcp 建立 TCP 服務偵聽端,接收客戶端連線,一旦客戶端連線上有新訊息到來,立即讀取。
- logpipe-output-tcp 建立 TCP 客戶端,連線服務端,一旦輸入外掛有訊息產生後輸出到該連線。
- logpipe-input-exec 執行長命令並捕獲輸出
- logpipe-output-hdfs 一旦輸入外掛有訊息產生後用相同的檔名落地到 HDFS 中。該外掛支援資料解壓。
使用者可根據自身需求,按照外掛開發規範,開發定製外掛,如 IBMMQ 輸入外掛、HDFS 輸出外掛等。
logpipe 配置採用 JSON 格式,層次分明,編寫簡潔,如示例:
{ "log" : { "log_file" : "/tmp/logpipe_case1_collector.log" , "log_level" : "INFO" } , "inputs" : [ { "plugin":"so/logpipe-input-file.so" , "path":"/home/calvin/log" , "compress_algorithm":"deflate" } ] , "outputs" : [ { "plugin":"so/logpipe-output-tcp.so" , "ip":"127.0.0.1" , "port":10101 } ] }