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

39次阅读

共计 6012 个字符,预计需要花费 16 分钟才能阅读完成。

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 我的项目全套学习教程连载中,关注公众号 第一工夫获取。

正文完
 0