当前位置:首页 > 技术分析 > 正文内容

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

ruisui883个月前 (03-20)技术分析23

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/目录下,配置信息如下:
    
      @type  forward
      @id    input1
      @label @mainstream
      port  24224
    
    
    
      @type stdout
    
    
    
    • 运行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配置文件如何配置,先放出完全配置,然后我们对里面的一些配置要点进行详细说明。

    完全配置

    
      @type  tcp
      @id    debug-input
      port  24221
      tag debug
      
     @type json
      
    
    
    
      @type  tcp
      @id    error-input
      port  24222
      tag error
      
     @type json
      
    
    
    
      @type  tcp
      @id    business-input
      port  24223
      tag business
      
     @type json
      
    
    
    
      @type  tcp
      @id    record-input
      port  24224
      tag record
      
     @type json
      
    
    
    
      @type parser
      key_name message
      reserve_data true
      remove_key_name_field true
      
        @type json
      
    
    
    
      @type stdout
      output_type json
    
    
    
      @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
    

    配置要点解析

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

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

    
      @type  tcp
      @id    debug-input
      port  24221
      tag debug
      
     @type json
      
    

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

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

    
      @type  tcp
      @id    debug-input
      port  24221
      tag debug
      
     @type json
      
    

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

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

    
      @type stdout
    

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

    
      @type parser
      key_name message
      reserve_data true
      remove_key_name_field true
      
        @type json
      
    

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

    这里我们使用elasticsearch来存储日志信息,logstash_format、logstash_prefix、logstash_dateformat主要用来控制日志索引名称的生成,当前配置生成debug日志的索引格式为
    docker-debug-logs-2020-06-03,flush_interval用来控制日志输出到elasticsearch的时间间隔。

    
      @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
    

    替换配置文件

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

    docekr restart efk-fluentd

    结合SpringBoot使用

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

    • 修改logback-spring.xml配置文件;
    
    
        ${LOG_STASH_HOST}:24221
    
    
    
    
        ${LOG_STASH_HOST}:24222
    
    
    
    
        ${LOG_STASH_HOST}:24223
    
    
    
    
        ${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/

    扫描二维码推送至手机访问。

    版权声明:本文由ruisui88发布,如需转载请注明出处。

    本文链接:http://www.ruisui88.com/post/2921.html

    分享给朋友:

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

    Slackware 15.0?发布:历史最久且在维护的Linux发行版本

    Slackware 14.0 于 2012 年发布,在经过了数年的等待之后 Slackware 15.0 发行版本于今天正式发布。Slackware 于 1993 年发布,是目前历史最悠久、且仍在维护的 Linux 发行版本。Slackware 15.0 在去年进入测试阶段,在发布几个候选版本之后终...

    抖音 Android 性能优化系列:启动优化实践

    启动性能是 APP 使用体验的门面,启动过程耗时较长很可能使用户削减使用 APP 的兴趣,抖音通过对启动性能做劣化实验也验证了其对于业务指标有显著影响。抖音有数亿的日活,启动耗时几百毫秒的增长就可能带来成千上万用户的留存缩减,因此,启动性能的优化成为了抖音 Android 基础技术团队在体验优化方向...

    摄影后期必看 | PS插件camera raw 16.4教程 | 范围蒙版

    范围蒙版Camera Raw 【蒙版】模块中提供了三个范围蒙版工具,可以通过特定的范围来创建蒙版。此次新增的【范围蒙版】大大加强了acr插件对局部调整的能力。点击下拉小箭头可以看到【颜色范围】,可用于快速选择想要编辑的颜色。快捷键:Shift + C【明亮度范围】,可用于快速选择想要调整的明亮度。快...

    精品微信小程序在线考试系统+后台管理系统|前后...

    《微信小程序在线考试系统+后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用Java+VUE微信小程序——前台涉及技术:WXML 和 WXSS、JavaScript...

    vue父组件修改子组件的值(通过调用子组件的方法)

    props只支持第一次加载这个组件的时候获取父组件的值,后续修改父组件的值得时候子组件并不会动态的更改。然而我们想要通过父组件修改子组件的值要怎么做呢?可以通过ref的方式调用子组件的方法改变子组件的值。子组件<template><div><span>{{data...

    vue+nginx代理配置,解决跨域问题

    举例登录接口,ip地址是随便举例的,实际生成地址域名,不一定是本地ip。前端首页地址是:http://192.168.1.25:8080/#/login,前端登录的地址是:http://192.168.1.25:8080/api/login后端登录接口地址是:http://192.168.1.24:...