SpringBoot實戰電商項目mall(35k+star)地址: https://github.com/macrozheng/mall
ELK
日誌收集系統你們都知道,可是還有一種日誌收集系統EFK
,確定有不少朋友不知道!這裏的F
指的是Fluentd
,它具備Logstash相似的日誌收集功能,可是內存佔用連Logstash的十分之一都不到,性能優越、很是輕巧。本文將詳細介紹Fluentd的使用,主要用來收集SpringBoot應用的日誌,但願對你們有所幫助!node
Fluentd是一款開源的日誌收集功能,致力於爲用戶搭建統一的日誌收集層,和Elasticsearch、Kibana一塊兒使用能夠搭建EFK日誌收集系統。什麼是統一的日誌收集層呢?看下下面這張圖就清楚了!git
在 《你竟然還去服務器上撈日誌,搭個日誌收集系統難道不香麼!》中已經介紹了ELK日誌收集系統的搭建,這裏就再也不介紹Elasticsearch和Kibana的安裝了,直接介紹Fluentd在Docker環境下的安裝。
docker pull fluent/fluentd:v1.10
fluent.conf
文件複製到/mydata/fluentd/
目錄下,配置信息以下:<source> @type forward @id input1 @label @mainstream port 24224 </source> <filter **> @type stdout </filter> <label @mainstream> <match docker.**> @type file @id output_docker1 path /fluentd/log/docker.*.log symlink_path /fluentd/log/docker.log append true time_slice_format %Y%m%d time_slice_wait 1m time_format %Y%m%dT%H%M%S%z </match> <match **> @type file @id output1 path /fluentd/log/data.*.log symlink_path /fluentd/log/data.log append true time_slice_format %Y%m%d time_slice_wait 10m time_format %Y%m%dT%H%M%S%z </match> </label>
24221~24224
四個端口用於接收不一樣類型的日誌;docker run -p 24221:24221 -p 24222:24222 -p 24223:24223 -p 24224:24224 --name efk-fluentd \ -v /mydata/fluentd/log:/fluentd/log \ -v /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf \ -d fluent/fluentd:v1.10
chmod 777 /mydata/fluentd/log/
root
用戶進入Fluentd容器內部;docker exec -it --user root efk-fluentd /bin/sh
fluent-gem install fluent-plugin-elasticsearch
docker-compose
一次性安裝EFK的話,能夠使用以下腳本,注意
使用user:root
啓動就不須要再修改目錄權限了!version: '3' services: elasticsearch: image: elasticsearch:6.4.0 container_name: efk-elasticsearch user: root environment: - "cluster.name=elasticsearch" #設置集羣名稱爲elasticsearch - "discovery.type=single-node" #以單一節點模式啓動 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #設置使用jvm內存大小 - TZ=Asia/Shanghai volumes: - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件掛載 - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #數據文件掛載 ports: - 9200:9200 - 9300:9300 kibana: image: kibana:6.4.0 container_name: efk-kibana links: - elasticsearch:es #能夠用es這個域名訪問elasticsearch服務 depends_on: - elasticsearch #kibana在elasticsearch啓動以後再啓動 environment: - "elasticsearch.hosts=http://es:9200" #設置訪問elasticsearch的地址 - TZ=Asia/Shanghai ports: - 5601:5601 fluentd: image: fluent/fluentd:v1.10 container_name: efk-fluentd user: root environment: - TZ=Asia/Shanghai volumes: - /mydata/fluentd/log:/fluentd/log - /mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf depends_on: - elasticsearch #kibana在elasticsearch啓動以後再啓動 links: - elasticsearch:es #能夠用es這個域名訪問elasticsearch服務 ports: - 24221:24221 - 24222:24222 - 24223:24223 - 24224:24224
fluent.conf
替換原來的配置文件,而後從新啓動Fluentd服務,新的配置文件會在下面給出。接下來咱們來介紹下Fluentd配置文件如何配置,先放出徹底配置,而後咱們對裏面的一些配置要點進行詳細說明。
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse> </source> <source> @type tcp @id error-input port 24222 tag error <parse> @type json </parse> </source> <source> @type tcp @id business-input port 24223 tag business <parse> @type json </parse> </source> <source> @type tcp @id record-input port 24224 tag record <parse> @type json </parse> </source> <filter record> @type parser key_name message reserve_data true remove_key_name_field true <parse> @type json </parse> </filter> <match fluent.**> @type stdout output_type json </match> <match **> @type elasticsearch host 192.168.3.101 port 9200 type_name docker logstash_format true logstash_prefix docker-${tag}-logs logstash_dateformat %Y-%m-%d flush_interval 5s include_tag_key true </match>
<source>
定義了日誌收集的來源,能夠有tcp、udp、tail(文件)、forward(tcp+udp)、http等方式。
這裏咱們從tcp請求收集日誌,端口爲24221
,而且設置了tag爲debug
。github
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse> </source>
<parse>
定義對原始數據的解析方式,能夠將日誌轉化爲JSON。
好比咱們將debug日誌轉化爲JSON能夠進行以下配置。正則表達式
<source> @type tcp @id debug-input port 24221 tag debug <parse> @type json </parse> </source>
<filter>
能夠對收集的日誌進行一系列的處理,好比說將日誌打印到控制檯或者對日誌進行解析。
將全部日誌打印到控制檯的配置:spring
<filter **> @type stdout </filter>
對於tag爲record
來源的日誌,咱們將其中的message
屬性轉化爲JSON格式,若是不進行轉化的話,message
屬性將會是一個字符串。docker
<filter record> @type parser key_name message reserve_data true remove_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的時間間隔。json
<match **> @type elasticsearch host 192.168.3.101 port 9200 type_name docker logstash_format true logstash_prefix docker-${tag}-logs logstash_dateformat %Y-%m-%d flush_interval 5s include_tag_key true </match>
替換掉原來的/mydata/fluentd/fluent.conf
配置文件,而後再從新啓動服務,咱們的Fluentd服務就能夠開始收集日誌了。bash
docekr restart efk-fluentd
其實Fluentd收集日誌的原理和Logstash同樣,都是經過tcp端口來收集日誌,因此咱們只要把logback配置文件中原來Logstash日誌收集地址端口改成Fluentd的便可。
logback-spring.xml
配置文件;<!--DEBUG日誌輸出到LogStash--> <appender name="LOG_STASH_DEBUG" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24221</destination> </appender> <!--ERROR日誌輸出到LogStash--> <appender name="LOG_STASH_ERROR" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24222</destination> </appender> <!--業務日誌輸出到LogStash--> <appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24223</destination> </appender> <!--接口訪問記錄日誌輸出到LogStash--> <appender name="LOG_STASH_RECORD" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>${LOG_STASH_HOST}:24224</destination> </appender>
application-dev.yml
配置中的logstash.host
屬性。logstash: host: localhost
至此咱們的EFK日誌收集系統搭建完成了,只需在Kibana中使用便可。
Management->Kibana->Index Patterns
中能夠建立Index Patterns
,Kibana服務訪問地址:http://192.168.3.101:5601
接下來咱們來對這兩個日誌收集工具的各個方面作個對比。
對比方面 | Logstash | Fluentd |
---|---|---|
內存佔用 | 啓動1G左右 | 啓動60M左右 |
CPU佔用 | 較高 | 較低 |
支持插件 | 豐富 | 豐富 |
通用日誌解析 | 支持grok(基於正則表達式)解析 | 支持正則表達式解析 |
特定日誌類型 | 支持JSON等主流格式 | 支持JSON等主流格式 |
數據過濾 | 支持 | 支持 |
數據buffer發送 | 插件支持 | 插件支持 |
運行環境 | JRuby實現,依賴JVM環境 | CRuby、C實現,依賴Ruby環境 |
線程支持 | 支持多線程 | 多線程受GIL限制 |
官方文檔:https://docs.fluentd.org/服務器
https://github.com/macrozheng...多線程
mall項目全套學習教程連載中,關注公衆號第一時間獲取。