目前基於elk架構的日誌系統,通過filebeat收集上來的日誌都會傳送到同乙個kafka topic中,然後再由logstash消費處理寫入elasticsearch中,這種方式導致該topic包含所有業務日誌,那麼各個業務去做實時統計分析就會造成重複消費,使得流量成本的浪費;對於離線分析的日誌**是通過在應用服務端定時上傳的方式,對於日誌量比較大的業務,一方面上傳時會對應用伺服器造成比較大的壓力,另一方面這種上傳方式對於後續小時或者分鐘級別分析造成一定延時。本文將會介紹基於flink的日誌採集平台來解決這些問題。
•拆分:最上層kafka a表示由filebeat收集上來的應用日誌,然後通過flink程式對kafka topic進行拆分,根據不同的業務拆分到到下游kafka b不同的topic中,那麼對於下游的實時處理任務只需要消費對應的業務日誌即可,避免了重複消費;
•轉儲:對於傳送到kafka b不同的業務日誌,通過flink程式轉儲寫入到hdfs上,生成小時分割槽檔案,供後續的離線日誌分析避免重複消費:為了避免對大topic的重複消費,對於同乙個topic只會消費一次,也就是只會啟動乙個flink任務,按照一定的規則對資料進行拆分,常見的規則就是應用名稱、型別、日誌檔名稱等,在filebeat收集的時候這些資訊都會被帶上,作為拆分的依據;可配置化:為了滿足業務方能夠快速獲取自己的業務日誌,就必須提供可配置規則的視覺化介面,提供填寫拆分應用標識、目標kafka topic等,將這些規則資訊儲存在資料庫中,然後拆分的flink任務定時載入規則資訊;日誌格式:在實踐中規定日誌格式是非常有必要的,為了保證拆分任務能夠準確的拆分出對應的業務日誌,就必須按照指定的日誌格式進行打點通用實現:對於不同的業務日誌,其日誌的具體內容肯定各不相同,對於我們來說不可能每乙個業務都去寫一套轉儲的程式,希望一套程式能夠處理所有的業務日誌,因此對於我們來說不管任何日誌對於我們來說其所代表的含義就是乙個data欄位對應的資料,那麼就只需要把這個data欄位寫入到對應的hdfs目錄檔案即可;資料分割槽:預設分割槽字段根據日誌中乙個固定的時間字段進行分割槽,在實踐中對於老的日誌並沒有按照規範日誌進行打點或者分割槽的時間字段不是通用的乙個字段,需要按照日誌中乙個特殊的字段解析進行分割槽,如果將這個解析直接放在程式裡面根據業務判斷,最終的結果會造成**很難維護,解決方式就是將datastream處理轉換為table/sql 的處理,將資料流註冊成表,然後通過udf去解析出來需要的分割槽字段,同樣這個udf無法通用,那麼就必須支援不同的udf,但是對於處理卻是通用的,例如: select data,udf(data) from tbl , 是乙個固定的模板,只需要對於不同的轉儲程式載入不同的udf即可,通過calcite 做sql語法解析,解析出使用的udf, 然後將其註冊即可;可配置化:同樣需要提供介面讓業務只需要通過配置一些規則即可完成日誌的收集,配置消費的topic、寫入資料位置、自定義分割槽語句支援(上面提到的自定義udf)等,在後台自動完成日誌的收集開啟;其他幾點:日誌壓縮與小檔案合併可參考:streamingfilesink壓縮與合併小檔案; 在實現過程中可能會存在集群遷移的場景,即將資料寫入到另外的乙個集群中,對於bulk的檔案寫入方式,其檔案的滾動會在每次checkpoint使檔案滾動,使用的滾動策略實現是oncheckpointrollingpolicy,因此可以直接將hdfs檔案copy到另外乙個集群中,重新消費kafka的offset與生成的檔案是同步的,但是存在另外乙個問題,在hdfs上檔名稱的生成規則是part-subtask-index,此時切換集群任務沒有從checkpoint恢復index重新從0開始遞增,存在覆蓋以前檔案的風險,因此對檔案生成規則進行自定義,例如加上集群標識等。本篇主要介紹了基於flink的採集架構以及一些關鍵的實現點,歡迎交流。
Flink日誌相關
flink日誌的使用 直接在類內定義,即可使用。當然了,pom匯入,看你喜歡怎麼用了 org.slf4jgroupid slf4j log4j12artifactid 1.7.7version runtimescope dependency log4jgroupid log4jartifactid ...
syslog日誌系統 日誌採集
日誌採集介面把接收過來的日誌資料寫入到日誌檔案,日誌檔案以天為單位進行儲存。介面採用 ignoretoken標記不需要進行令牌校驗。採用 crossorigin標記,讓介面能夠跨域訪問,支援ajax跨域請求。apioperation value 提交日誌 apiimplicitparams path...
syslog日誌系統 日誌採集
摘自 日誌採集介面把接收過來的日誌資料寫入到日誌檔案,日誌檔案以天為單位進行儲存。介面採用 ignoretoken標記不需要進行令牌校驗。採用 crossorigin標記,讓介面能夠跨域訪問,支援ajax跨域請求。apioperation value 提交日誌 apiimplicitparams l...