高效能日誌採集工具logpipe更新至1.0.9版本
1.0.9 2018-11-15 calvin
* 外掛logpipe-output-ingeek的服務端主機配置數量擴大到32個
1.0.8 2018-11-08 calvin
* 清理了不少遺留程式碼
* 其它幾個遺漏未改select的地方也改用poll了
* 新增分解日誌行傳送外掛程式碼模板logpipe-output-linemode-template.c
1.0.7 2018-10-10 calvin
* 解決了logpipe-output-ingeek.so使用select描述字大於1024而導致的異常,改用poll
* 按讀檔案內容塊輪訓上游服務端改成按日誌行塊
1.0.6 2018-09-10 calvin
* 外掛logpipe-input-file.so和logpipe-output-ingeek.so新增NOTICE等級日誌
* 外掛logpipe-output-ingeek.so新增引數iov_send_timeout,iov_connect_interval
* 新增公函writev3,首先用於外掛logpipe-output-ingeek.so
1.0.5 2018-09-07 calvin
* 優化logpipe-output-ingeek分割行和合並通訊傳送效能
* 新增測試程式press_LOGC
1.0.4 2018-09-06 calvin
* 優化logpipe-output-ingeek
1.0.3 2018-09-06 calvin
* 調整了logpipe-input-file一些return值,不輕易返回-1導致退出
* logpipe-input-file配置引數files和exclude_files增加到8個
* 調整了所有外掛的版本全域性變數
* 精簡了logpipe-output-ingeek日誌
1.0.2 2018-09-05 calvin
* 調整了檔案改名事件的錯誤處理
1.0.1 2018-08-23 calvin
* 修正了日誌等級常量字串集合缺漏
* 沒有配置輸出外掛時不應該報錯
1.0.0 2018-07-28 calvin
* 釋出v1.0.0版本
0.22.6 2018-07-23 calvin
* 解決了移出檔案沒有釋放的問題
0.22.5 2018-07-21 calvin
* 外掛logpipe-input-file.so重構成IN_ONESHOT模式
0.22.4 2018-07-20 calvin
* 清除無用程式碼
0.22.3 2018-06-30 calvin
* 同步更新iLOG3.LOGC
0.22.2 2018-06-27 calvin
* 外掛logpipe-input-file.so新增邏輯,變化檔案在1、2、4...秒後檢測大小,一共嘗試6次
0.22.1 2018-06-26 calvin
* 新增指令碼shbin/logpipe.sh和shbin/logpipe_pack_bin.sh
0.22.0 2018-06-20 calvin
* 新增目錄test以及兩個測試程式
* 檔案偏移量、塊長度等從32位升級到64位,能處理更大大小的檔案了 ***不向下相容,如內部通訊協議等***
0.21.11 2018-06-19 calvin
* 外掛logpipe-input-file.so
新增引數min_usleep_interval
刪除事件改為立即處理
其它一些優化調整
* 修正公函size_atol和usleep_atol
0.21.10 2018-06-17 calvin
* 新增API size_atoi用於外掛引數大小單位轉換
* 新增API usleep_atoi用於外掛引數微秒單位轉換
* 外掛logpipe-input-file.so
新增引數max_usleep_interval用於沉睡間隔,降低CPU耗用
增加捕獲子目錄下的檔案刪除事件,防止檔案IN_DELETE_SELF漏事件
inotify事件佇列溢位時檢查所有檔案偏移量處理合併為一輪一次
0.21.9 2018-06-10 calvin
* 修正了小日誌檔案沒有及時採集的問題
* 根據修改過的需求改造logpipe-output-ingeek.so
0.20.8 2018-06-09 calvin
* 優化了logpipe-input-file.so效能
0.20.7 2018-06-08 calvin
* 優化了logpipe-input-file.so效能
0.20.6 2018-06-05 calvin
* 優化了logpipe-input-file.so和logpipe-output-file.so效能
0.20.5 2018-06-03 calvin
* 修正了logpipe-output-file.so大小轉檔問題
0.20.4 2018-05-31 calvin
* 增加logpipe-output-ingeek.so傳送TCP效能日誌
* 調整了部分日誌等級
* 增大了自身日誌緩衝區大小
0.20.3 2018-05-30 calvin
* 修正了logpipe-output-ingeek.c和logpipe-output-tcp.c剛連線完未資料收發時停止logpipe,因為p_forward_session指標未賦值引發的coredump
0.20.2 2018-05-28 calvin
* 修正了src-plugins/logpipe-output-ingeek.c和src-plugins/logpipe-output-ek.c解析快取區與logpipe輸入緩衝區大小相似造成的大量折行問題
0.20.1 2018-05-18 calvin
* 鉤子函式原型變動funcReadInputPlugin和funcWriteOutputPlugin
* 外掛logpipe-output-ingeek調整通訊協議
0.20.0 2018-05-10 calvin
* 鉤子函式原型變動funcReadInputPlugin和funcWriteOutputPlugin
* 輸入外掛logpipe-input-file內部檔案偏移量遞增改成小步累加
* 新增輸出外掛logpipe-output-ingeek
0.19.0 2018-05-03 calvin
* 外掛logpipe-input-file補充引數files2,file3,exclude_files2,exclude_files3
0.18.0 2018-04-19 calvin
* 新增空閒事件函式用於無輸入事件時定期呼叫,如logpipe-output-kafka定期檢查非同步響應
0.17.0 2018-04-19 calvin
* 新增外掛logpipe-output-kafka
-----------------------------------------------------------------
1. 概述
在叢集化環境裡,日誌採集是重要基礎設施。
開源主流解決方案是基於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自帶了5個外掛(今後將開發更多外掛),分別是:
* 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 }]}