性能优越的轻量级日志收集工具,微软、亚马逊都在用!
ELK日志收集系統大家都知道,但是還有一種日志收集系統EFK,肯定有很多朋友不知道!這里的F指的是Fluentd,它具有Logstash類似的日志收集功能,但是內存占用連Logstash的十分之一都不到,性能優越、非常輕巧。本文將詳細介紹Fluentd的使用,主要用來收集SpringBoot應用的日志,希望對大家有所幫助!
Fluentd 簡介
Fluentd是一款開源的日志收集功能,致力于為用戶搭建統一的日志收集層,和Elasticsearch、Kibana一起使用可以搭建EFK日志收集系統。什么是統一的日志收集層呢?看下下面這張圖就清楚了!
來自Fluentd官網
安裝
下載Fluentd的Docker鏡像;
將默認配置fluent.conf文件復制到/mydata/fluentd/目錄下,配置信息如下:
運行Fluentd服務,需要開放24221~24224四個端口用于接收不同類型的日志;
第一次啟動可能會失敗,修改目錄權限后重新啟動即可;
使用root用戶進入Fluentd容器內部;
安裝Fluentd的Elasticsearch插件;
如果你依然想使用docker-compose一次性安裝EFK的話,可以使用如下腳本,注意使用user:root啟動就不需要再修改目錄權限了!
使用新的配置文件fluent.conf替換原來的配置文件,然后重新啟動Fluentd服務,新的配置文件會在下面給出。
? ?
Fluentd配置詳解
接下來我們來介紹下Fluentd配置文件如何配置,先放出完全配置,然后我們對里面的一些配置要點進行詳細說明。
完全配置
<source>@type??tcp@id????debug-inputport??24221tag?debug<parse>@type?json</parse> </source><source>@type??tcp@id????error-inputport??24222tag?error<parse>@type?json</parse> </source><source>@type??tcp@id????business-inputport??24223tag?business<parse>@type?json</parse> </source><source>@type??tcp@id????record-inputport??24224tag?record<parse>@type?json</parse> </source><filter?record>@type?parserkey_name?messagereserve_data?trueremove_key_name_field?true<parse>@type?json</parse> </filter><match?fluent.**>@type?stdoutoutput_type?json </match><match?**>@type?elasticsearchhost?192.168.3.101port?9200type_name?dockerlogstash_format?truelogstash_prefix?docker-${tag}-logslogstash_dateformat?%Y-%m-%dflush_interval?5sinclude_tag_key?true </match>配置要點解析
<source>
定義了日志收集的來源,可以有tcp、udp、tail(文件)、forward(tcp+udp)、http等方式。
這里我們從tcp請求收集日志,端口為24221,并且設置了tag為debug。
<source>@type??tcp@id????debug-inputport??24221tag?debug<parse>@type?json</parse> </source><parse>
定義對原始數據的解析方式,可以將日志轉化為JSON。
比如我們將debug日志轉化為JSON可以進行如下配置。
<source>@type??tcp@id????debug-inputport??24221tag?debug<parse>@type?json</parse> </source><filter>
可以對收集的日志進行一系列的處理,比如說將日志打印到控制臺或者對日志進行解析。
將所有日志打印到控制臺的配置:
<filter?**>@type?stdout </filter>對于tag為record來源的日志,我們將其中的message屬性轉化為JSON格式,如果不進行轉化的話,message屬性將會是一個字符串。
<filter?record>@type?parserkey_name?messagereserve_data?trueremove_key_name_field?true<parse>@type?json</parse> </filter><match>
定義了收集到的日志最后輸出到哪里,可以輸出到stdout(控制臺)、file、elasticsearch、mongo等里面。
這里我們使用elasticsearch來存儲日志信息,logstash_format、logstash_prefix、logstash_dateformat主要用來控制日志索引名稱的生成,當前配置生成debug日志的索引格式為docker-debug-logs-2020-06-03,flush_interval用來控制日志輸出到elasticsearch的時間間隔。
<match?**>@type?elasticsearchhost?192.168.3.101port?9200type_name?dockerlogstash_format?truelogstash_prefix?docker-${tag}-logslogstash_dateformat?%Y-%m-%dflush_interval?5sinclude_tag_key?true </match>替換配置文件
替換掉原來的/mydata/fluentd/fluent.conf配置文件,然后再重新啟動服務,我們的Fluentd服務就可以開始收集日志了。
docekr?restart?efk-fluentd結合SpringBoot使用
其實Fluentd收集日志的原理和Logstash一樣,都是通過tcp端口來收集日志,所以我們只要把logback配置文件中原來Logstash日志收集地址端口改為Fluentd的即可。
修改logback-spring.xml配置文件;
如果你的Fluentd不是部署在原來Logstash的服務器上,還需要修改application-dev.yml配置中的logstash.host屬性。
啟動并運行我們的SpringBoot應用。
??
Kibana中查看日志
至此我們的EFK日志收集系統搭建完成了,只需在Kibana中使用即可。
在Management->Kibana->Index Patterns中可以創建Index Patterns,Kibana服務訪問地址:http://192.168.3.101:5601
創建完成后查看日志,可以看出該日志收集功能和我們之前搭建的ELK系統完全相同。
?
Logstash vs Fluentd
接下來我們來對這兩個日志收集工具的各個方面做個對比。
| 對比方面 | Logstash | Fluentd |
內存占用 | 啟動1G左右 | 啟動60M左右 |
CPU占用 | 較高 | 較低 |
支持插件 | 豐富 | 豐富 |
通用日志解析 | 支持grok(基于正則表達式)解析 | 支持正則表達式解析 |
特定日志類型 | 支持JSON等主流格式 | 支持JSON等主流格式 |
數據過濾 | 支持 | 支持 |
數據buffer發送 | 插件支持 | 插件支持 |
運行環境 | JRuby實現,依賴JVM環境 | CRuby、C實現,依賴Ruby環境 |
線程支持 | 支持多線程 | 多線程受GIL限制 |
參考資料
官方文檔:https://docs.fluentd.org/
項目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-log
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的性能优越的轻量级日志收集工具,微软、亚马逊都在用!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花了20分钟,给女朋友们写了一个web版
- 下一篇: NYOJ 640 Geometric S