SpringBoot实战电商我的项目mall(35k+star)地址:https://github.com/macrozheng/mall

摘要

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_formatlogstash_prefixlogstash_dateformat次要用来管制日志索引名称的生成,以后配置生成debug日志的索引格局为docker-debug-logs-2020-06-03flush_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

接下来咱们来对这两个日志收集工具的各个方面做个比照。
比照方面LogstashFluentd
内存占用启动1G左右启动60M左右
CPU占用较高较低
反对插件丰盛丰盛
通用日志解析反对grok(基于正则表达式)解析反对正则表达式解析
特定日志类型反对JSON等支流格局反对JSON等支流格局
数据过滤反对反对
数据buffer发送插件反对插件反对
运行环境JRuby实现,依赖JVM环境CRuby、C实现,依赖Ruby环境
线程反对反对多线程多线程受GIL限度

参考资料

官网文档:https://docs.fluentd.org/

我的项目源码地址

https://github.com/macrozheng...

公众号

mall我的项目全套学习教程连载中,关注公众号第一工夫获取。