关于java:性能优越的轻量级日志收集工具微软亚马逊都在用

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

接下来咱们来对这两个日志收集工具的各个方面做个比照。

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

参考资料

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

我的项目源码地址

https://github.com/macrozheng…

公众号

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理