Fluentd是一個日志收集工具,有輸入端和輸出端的概念,前者主要是日志的來源,你可以走多種來源方式,http,forward,tcp都可以,后者輸出端主要指把日志進行持久化的過程,你可以直接把它持久化到elasticsearch里,也可以直接在控制台輸出,這看你如何配置了,更多基礎配置可以看大叔這篇文章《ELK系列~對fluentd參數的理解》。
Fluentd輸入端的小知識
今天寫這篇文章主要是因為在實際工作中遇到的問題,我們為了查詢方便把日志定義成了json格式,當你的輸入日志不是json時,這條日志將會被拋棄,這個功能點由fluentd的filter過濾器實現,它可以判斷你的輸入日志是否為json,即不是json會被拋棄!
在項目中出現了大日志無法寫入elasticsearch的問題
問題的出現
經過多次測試,發現大於16K的json日志,無法寫入elastic,原因經過分析得出結論:當fluentd輸入端的日志大於16K時,會被拆封成小日志進行收集,這時被拆封的json就不是標准的了,所以在經過filter時,將會被拋棄!
Fluentd工作流程圖
Fluentd大日志分塊收集
對於大於16K的日志來說,Fluentd的輸入端會分塊收集,即大日志被拆封成多個小日志,這時我們設想一下,如果你輸入的是json,那被折斷之后就一定不是標准的json了,這時,再走filter過濾器時,這條不是json的日志將被折斷!
解決方法
目前這個問題在國外開發人員中也出現了,在github上也有人提這個issue,可能是fluentd的bug,我們將繼續關注!