性能優越的輕量級日誌收集工具,微軟、亞馬遜都在用

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章