从一份定义文件详解 ELK 中 Logstash 插件结构 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hansonwang99
V2EX    程序员

从一份定义文件详解 ELK 中 Logstash 插件结构

  •  
  •   hansonwang99
    hansonwang99 2018-07-24 22:38:42 +08:00 2011 次点击
    这是一个创建于 2687 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Profile



    概述

    当下分布式系统的 日志收集、日志分析、日志处理、可视化 的热门技术栈方案当然非 ELK (ElasticSearch、Logstash、Kibana )莫属,从 L → E → K 构成了一条数据的 Pipeline 管道:

    • Logstash:与数据源对接,用于收集、过滤处理你的日志、事务或其他数据
    • ElasticSearch:是一个开源的,分布式 RESTful 搜索引擎,在 ELK 中可以初略理解为数据存储的地方
    • Kibana:将 Elasticsearch 的数据分析并渲染为可视化的报表,便于高效分析

    而且在我的前文《利用 ELK 搭建 Docker 容器化应用日志中心》之中,曾利用 ELK 搭建了一条数据管道,用作 Docker 容器化应用的日志中心。



    为什么先讲 Logstash

    作为与数据源 “直接对接” 的 Logstash,位置处于 ELK 数据管道的 最前端,其主要作用是 收集、过滤分析、输出 各种结构化或者非结构化的原始数据(典型的如日志数据),原始数据从 “无序变有序” 的重担就落在了 Logstash 的肩上了,因此其作用举足轻重。

    说到 Logstash,不得不说其中的 插件机制,其几乎所有的功能都是靠插件来实现的,因此灵活易用:

    • 关于 数据收集,Logstash 提供了输入插件来支持各种不同的数据源
    • 关于 数据分析,Logstash 则提供了过滤器插件来支持对输入原始数据的花式处理
    • 关于 数据输出,Logstash 也提供了各种输出插件,从而支持将结果数据输出到各种地方,比如标准控制台,文件,各种数据库包括 ElasticSearch 等


    Logstash 的插件管理

    Logstash 插件是使用 Ruby 开发的,Logstash 从很早的 1.5.0+版开始,其插件模块和核心模块便分开维护,其插件使用的是 RubyGems 包管理器来管理维护。所以 Logstash 插件本质上就是自包含的 RubyGems。

    RubyGems (简称 gems )是一个用于对 Ruby 组件进行打包的 Ruby打包系统。 它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。

    可以在网址 rubygems.org上搜索所有 Logstash 插件:

    rubygems.org

    关于插件的常用操作如下:

    • 安装插件

    可以在线安装:

    bin/plugin install [插件名称] 

    当然也可以将插件提前下载到本地,然后本地安装:

    bin/plugin install path/logstash-xxx-x.x.x.gem 
    • 卸载插件
    bin/plugin uninstall [插件名称] 
    • 更新插件
    bin/plugin update [插件名称] 

    其会将插件更新到最新的版本



    Logstash 的插件定义语法结构

    Logstash 插件的定义其实使用的就是一套其自定义的 DSL 语法,我还是习惯用图来说明吧:

    Logstash 的插件结构

    从图中可以看出主要包含以下几大部分内容:

    1. 需要的依赖

    该部分一般会用 require 语法引入如下依赖:

    require "logstash/XXX/base" require "logstash/namespace" 
    • 前者引入 特定类型插件的依赖
    • 后者引入 模块命名空间

    2. 类定义

    需要用 class语法给每一个插件定义一个类,后面我会用实际代码说明

    3. 配置插件名字

    通过 config_name 语法来给插件取一个名字,这个名字将会用到 Logstash.conf 配置文件的插件配置之中

    4. 配置选项设置

    可以使用 config 语法来按需定义任意个配置项。可以设置配置选项的名字、数据类型、默认值以及是否为必选项:

    举例:

    config :percentage, :validate => :number, :default =>100 
    • :percentage:定义配置项的名字
    • :validate:配置指定参数的数据类型,如此处为 number 类型
    • :default:指定配置项的默认值
    • :required:用于指定配置项是否必选

    5. 插件方法

    每一种类型的插件都需要实现一些方法,如下表所示:

    插件类型 | 插件方法 | :---: | :---: | 输入插件 | register、run | 过滤器插件 | register、filter | 输出插件 | register、receive | 编解码插件 | register、encode、decode |

    Logstash 插件所具备的业务处理功能就来源于上述插件方法业务逻辑实现!

    好了,理论部分总结到这,下面结合一份 Logstash 插件定义的源码来例析一下!



    一份 Logstash 插件定义文件例析

    我们以 Logstash 插件的官网给出的一个 Logstash 过滤器插件 logstash-filter-example 的源码为例来进行分析,麻雀虽小,五脏俱全!代码解析已经标注于图中,不再赘述。

    logstash-filter-example 插件源码

    当然此处的实例给出的是一个入门实例,毕竟不可能在一篇篇幅有限的文章里给出一个太过复杂的 Logstash 的插件源码。对照该源码和上一节的内容,我想应该不难理解 Logstash 的插件源码结构了吧。

    计划后续展示一个 根据具体数据需求 来自定义开发一个满足特定需求的 Logstash 插件的实例。



    后记

    作者更多的 SpringBt 实践文章在此:


    如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:



    2 条回复    2018-07-25 09:15:35 +08:00
    hansonwang99
        1
    hansonwang99  
    OP
       2018-07-24 23:38:47 +08:00 via iPhone
    为何没人喷
    gitgit
        2
    gitgit  
       2018-07-25 09:15:35 +08:00
    喷不懂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4514 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 04:03 PVG 12:03 LAX 20:03 JFK 23:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86