0.16.1 2018-01-16 calvin
* 修正了插件logpipe-input-file的轉檔時重複讀取問題
0.16.0 2018-01-15 calvin
* 優化了插件logpipe-output-ek性能,性能提高了一倍
* 插件logpipe-input-file新增配置參數max_append_count,均勻處理所有文件增長事件
* 擴大了日誌緩衝區
0.15.0 2018-01-03 calvin
* 插件logpipe-output-tcp支持輪詢算法的負載均衡輸出
0.14.2 2018-01-03 calvin
* 插件logpipe-output-ek新增配置參數iconv_from和iconv_to用於轉換編碼
* 插件logpipe-output-ek連接ElasticSearch改為長連接模式,以提高性能
0.14.1 2017-12-30 calvin
* 插件logpipe-input-file配置參數file改成file
* 插件logpipe-input-file新增配置參數exclude_files用於過濾文件名
0.14.0 2017-12-29 calvin
* 新增插件logpipe-output-ek,自帶系統(CPU、內存、硬碟、網絡)監控示例
0.13.0 2017-12-27 calvin
* 新增插件logpipe-output-hdfs
0.12.0 2017-12-22 calvin
* 插件logpipe-input-file新增配置參數file,用於過濾採集文件名
0.11.0 2017-12-21 calvin
* 新增插件logpipe-input-exec用於執行長命令捕獲輸出
0.10.1 2017-12-21 calvin
* 修正了logpipe自身日誌轉檔後沒有清空循環日誌的問題
0.10.0 2017-12-20 calvin
* logpipe-output-file新增配置參數rotate_size,exec_after_rotating
* logpipe日誌大小轉檔後綴改為"-YYYYMMDD_hhmmss_06us"
-------------------------------------------------------------------------
# 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 } ]}