ELK日誌收集系統大家都知道,但是還有一種日誌收集系統EFK,肯定有很多朋友不知道!這裏的F指的是Fluentd,它具有Logstash類似的日誌收集功能,但是內存佔用連Logstash的十分之一都不到,性能優越、非常輕巧。本文將詳細介紹Fluentd的使用,主要用來收集SpringBoot應用的日誌,希望對大家有所幫助!
Fluentd 簡介
Fluentd是一款開源的日誌收集功能,致力於爲用戶搭建統一的日誌收集層,和Elasticsearch、Kibana一起使用可以搭建EFK日誌收集系統。什麼是統一的日誌收集層呢?看下下面這張圖就清楚了!
安裝
在你居然還去服務器上撈日誌,搭個日誌收集系統難道不香麼!中已經介紹了ELK日誌收集系統的搭建,這裏就不再介紹Elasticsearch和Kibana的安裝了,直接介紹Fluentd在Docker環境下的安裝。
- 下載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>
- 運行Fluentd服務,需要開放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
- 安裝Fluentd的Elasticsearch插件;
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配置詳解
接下來我們來介紹下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。
<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>
可以對收集的日誌進行一系列的處理,比如說將日誌打印到控制檯或者對日誌進行解析。
將所有日誌打印到控制檯的配置:
<filter **>
@type stdout
</filter>
對於tag爲record來源的日誌,我們將其中的message屬性轉化爲JSON格式,如果不進行轉化的話,message屬性將會是一個字符串。
<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的時間間隔。
<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服務就可以開始收集日誌了。
docekr restart efk-fluentd
結合SpringBoot使用
其實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>
- 如果你的Fluentd不是部署在原來Logstash的服務器上,還需要修改application-dev.yml配置中的logstash.host屬性。
logstash:
host: localhost
- 啓動並運行我們的SpringBoot應用。
Kibana中查看日誌
至此我們的EFK日誌收集系統搭建完成了,只需在Kibana中使用即可。
- 在Management->Kibana->Index Patterns中可以創建Index Patterns,Kibana服務訪問地址:http://192.168.3.101:5601
- 創建完成後查看日誌,可以看出該日誌收集功能和我們之前搭建的ELK系統完全相同。
Logstash vs Fluentd
接下來我們來對這兩個日誌收集工具的各個方面做個對比。
參考資料
官方文檔:https://docs.fluentd.org/