性能优越的轻量级日志收集工具,微软、亚马逊都在用

ELK日志收集系统大家都知道,但是还有一种日志收集系统EFK,肯定有很多朋友不知道!这里的F指的是Fluentd,它具有Logstash类似的日志收集功能,但是内存占用连Logstash的十分之一都不到,性能优越、非常轻巧。本文将详细介绍Fluentd的使用,主要用来收集SpringBoot应用的日志,希望对大家有所帮助!

Fluentd 简介

Fluentd是一款开源的日志收集功能,致力于为用户搭建统一的日志收集层,和Elasticsearch、Kibana一起使用可以搭建EFK日志收集系统。什么是统一的日志收集层呢?看下下面这张图就清楚了!


安装

你居然还去服务器上捞日志,搭个日志收集系统难道不香么!中已经介绍了ELK日志收集系统的搭建,这里就不再介绍Elasticsearch和Kibana的安装了,直接介绍Fluentd在Docker环境下的安装。

下载Fluentd的Docker镜像;

dockerpullfluent/fluentd:v1.10

将默认配置fluent.conf文件复制到/mydata/fluentd/目录下,配置信息如下:

  @type  forward  @id    input1  @label @mainstream  port24224

<filter **>

  @type stdout

</filter>      @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_wait1mtime_format       %Y%m%dT%H%M%S%z  

  <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_wait10mtime_format       %Y%m%dT%H%M%S%z  

</label>

运行Fluentd服务,需要开放24221~24224四个端口用于接收不同类型的日志;

dockerrun-p24221:24221-p24222:24222-p24223:24223-p24224:24224--nameefk-fluentd\-v/mydata/fluentd/log:/fluentd/log\-v/mydata/fluentd/fluent.conf:/fluentd/etc/fluent.conf\-dfluent/fluentd:v1.10

第一次启动可能会失败,修改目录权限后重新启动即可;

chmod777/mydata/fluentd/log/

使用root用户进入Fluentd容器内部;

dockerexec-it --user root efk-fluentd /bin/sh

安装Fluentd的Elasticsearch插件;

fluent-geminstallfluent-plugin-elasticsearch

如果你依然想使用docker-compose一次性安装EFK的话,可以使用如下脚本,注意使用user:root启动就不需要再修改目录权限了!

version:'3'services:elasticsearch:image:elasticsearch:6.4.0container_name:efk-elasticsearchuser:rootenvironment:-"cluster.name=elasticsearch"#设置集群名称为elasticsearch-"discovery.type=single-node"#以单一节点模式启动-"ES_JAVA_OPTS=-Xms512m -Xmx512m"#设置使用jvm内存大小-TZ=Asia/Shanghaivolumes:-/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins#插件文件挂载-/mydata/elasticsearch/data:/usr/share/elasticsearch/data#数据文件挂载ports:-9200:9200-9300:9300kibana:image:kibana:6.4.0container_name:efk-kibanalinks:-elasticsearch:es#可以用es这个域名访问elasticsearch服务depends_on:-elasticsearch#kibana在elasticsearch启动之后再启动environment:-"elasticsearch.hosts=http://es:9200"#设置访问elasticsearch的地址-TZ=Asia/Shanghaiports:-5601:5601fluentd:image:fluent/fluentd:v1.10container_name:efk-fluentduser:rootenvironment:-TZ=Asia/Shanghaivolumes:-/mydata/fluentd/log:/fluentd/log-/mydata/fluentd/fluent.conf:/fluentd/etc/fluent.confdepends_on:-elasticsearch#kibana在elasticsearch启动之后再启动links:-elasticsearch:es#可以用es这个域名访问elasticsearch服务ports:-24221:24221-24222:24222-24223:24223-24224:24224

使用新的配置文件fluent.conf替换原来的配置文件,然后重新启动Fluentd服务,新的配置文件会在下面给出。

Fluentd配置详解

接下来我们来介绍下Fluentd配置文件如何配置,先放出完全配置,然后我们对里面的一些配置要点进行详细说明。

完全配置

  @typetcp  @iddebug-inputport24221tagdebug @typejson    @typetcp  @iderror-inputport24222tagerror @typejson    @typetcp  @id    business-inputport24223tag business   @typejson    @typetcp  @id    record-inputport24224tag record   @typejson    @typeparser  key_name message  reserve_datatrueremove_key_name_fieldtrue    @typejson    @typestdoutoutput_type json  @typeelasticsearch  host192.168.3.101port9200type_name docker  logstash_formattruelogstash_prefix docker-${tag}-logs  logstash_dateformat %Y-%m-%d  flush_interval5s  include_tag_keytrue

配置要点解析

<source>

定义了日志收集的来源,可以有tcp、udp、tail(文件)、forward(tcp+udp)、http等方式。

这里我们从tcp请求收集日志,端口为24221,并且设置了tag为debug。

  @typetcp  @iddebug-inputport24221tagdebug @typejson  

<parse>

定义对原始数据的解析方式,可以将日志转化为JSON。

比如我们将debug日志转化为JSON可以进行如下配置。

  @typetcp  @iddebug-inputport24221tagdebug @typejson  

<filter>

可以对收集的日志进行一系列的处理,比如说将日志打印到控制台或者对日志进行解析。

将所有日志打印到控制台的配置:

  @typestdout

对于tag为record来源的日志,我们将其中的message属性转化为JSON格式,如果不进行转化的话,message属性将会是一个字符串。

  @typeparser  key_name message  reserve_datatrueremove_key_name_fieldtrue    @typejson  

<match>

定义了收集到的日志最后输出到哪里,可以输出到stdout(控制台)、file、elasticsearch、mongo等里面。

这里我们使用elasticsearch来存储日志信息,logstash_format、logstash_prefix、logstash_dateformat主要用来控制日志索引名称的生成,当前配置生成debug日志的索引格式为

docker-debug-logs-2020-06-03,flush_interval用来控制日志输出到elasticsearch的时间间隔。

<match**>@typeelasticsearchhost192.168.3.101port9200type_namedockerlogstash_formattruelogstash_prefixdocker-${tag}-logslogstash_dateformat%Y-%m-%dflush_interval5sinclude_tag_keytrue</match>

替换配置文件

替换掉原来的

/mydata/fluentd/fluent.conf配置文件,然后再重新启动服务,我们的Fluentd服务就可以开始收集日志了。

docekrrestart efk-fluentd

结合SpringBoot使用

其实Fluentd收集日志的原理和Logstash一样,都是通过tcp端口来收集日志,所以我们只要把logback配置文件中原来Logstash日志收集地址端口改为Fluentd的即可。

修改logback-spring.xml配置文件;

<!--DEBUG日志输出到LogStash-->${LOG_STASH_HOST}:24221<!--ERROR日志输出到LogStash-->${LOG_STASH_HOST}:24222<!--业务日志输出到LogStash-->${LOG_STASH_HOST}:24223<!--接口访问记录日志输出到LogStash-->${LOG_STASH_HOST}:24224

如果你的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/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容