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

SpringBoot實戰電商項目mall(35k+star)地址: https://github.com/macrozheng/mall

摘要

ELK日誌收集系統你們都知道,可是還有一種日誌收集系統EFK,確定有不少朋友不知道!這裏的F指的是Fluentd,它具備Logstash相似的日誌收集功能,可是內存佔用連Logstash的十分之一都不到,性能優越、很是輕巧。本文將詳細介紹Fluentd的使用,主要用來收集SpringBoot應用的日誌,但願對你們有所幫助!node

Fluentd 簡介

Fluentd是一款開源的日誌收集功能,致力於爲用戶搭建統一的日誌收集層,和Elasticsearch、Kibana一塊兒使用能夠搭建EFK日誌收集系統。什麼是統一的日誌收集層呢?看下下面這張圖就清楚了!git

來自Fluentd官網

安裝

《你竟然還去服務器上撈日誌,搭個日誌收集系統難道不香麼!》中已經介紹了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爲debuggithub

<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_formatlogstash_prefixlogstash_dateformat主要用來控制日誌索引名稱的生成,當前配置生成debug日誌的索引格式爲docker-debug-logs-2020-06-03flush_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

結合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

接下來咱們來對這兩個日誌收集工具的各個方面作個對比。
對比方面 Logstash Fluentd
內存佔用 啓動1G左右 啓動60M左右
CPU佔用 較高 較低
支持插件 豐富 豐富
通用日誌解析 支持grok(基於正則表達式)解析 支持正則表達式解析
特定日誌類型 支持JSON等主流格式 支持JSON等主流格式
數據過濾 支持 支持
數據buffer發送 插件支持 插件支持
運行環境 JRuby實現,依賴JVM環境 CRuby、C實現,依賴Ruby環境
線程支持 支持多線程 多線程受GIL限制

參考資料

官方文檔:https://docs.fluentd.org/服務器

項目源碼地址

https://github.com/macrozheng...多線程

公衆號

mall項目全套學習教程連載中,關注公衆號第一時間獲取。

公衆號圖片

相關文章
相關標籤/搜索