手把手教你编写Logstash插件

使用过Logstash的朋友都知道,它强大的插件生态几乎覆盖了所有的开源框架。从基本的http、tcp、udp、file,到强大的kafa、redis、ganglia,还有丰富的解析工具,比如date、json、grok、kv等等,有了它再也不用担心数据不好搜集了!

不过需求是无限的,如果这些框架都不满足怎么办呢?

没关系,十分佩服Logstash的作者,他以插件的方式组织每个部分,使得logstash本身具有超强的扩展性。

Logstash基本组成

有过使用经验的都知道Logstash主要由输入、过滤器、输出三部分组成。
每一部分的插件都符合统一的标准,因此扩展起来也十分容易。

自定义过滤器插件

由于需求大多都是集中在过滤部分,因此这里就简单的介绍下过滤器的自定义写法。

官网上面的过程太过繁琐,比如:

  • 1 创建github开源工程
  • 2 拷贝样例工程
  • 3 替换样例工程基本信息
  • 4 编写业务代码
  • 5 安装插件
  • 6 分享与贡献

但是如果自己用的话,上面做了很多的无用功。我这里提供一个极简的样例工程,插件的目录大致如下:

$ tree logstash-filter-example
├──lib
│   └── logstash
│       └── filters
│           └── mypluginname.rb
├── logstash-filter-example.gemspec

其实只需要这两个文件即可!

先看看logstash-filter-example.gemspec都做了什么吧!

Gem::Specification.new do|s|
  s.name ='logstash-filter-example'
  s.version ='1.0.0'
  s.licenses =['Apache License (2.0)']
  s.summary =" "
  s.description =" "
  s.authors =["xingoo"]
  s.email ='xinghalo@163.com'
  s.homepage ="http://www.elastic.co/guide/en/logstash/current/index.html"
  s.require_paths =["lib"]# Files
  s.metadata ={"logstash_plugin"=>"true","logstash_group"=>"filter"}# Gem dependencies
  s.add_runtime_dependency 'logstash-core','>= 2.0.0','< 3.0.0'
  s.add_development_dependency 'logstash-devutils'
end

上面的信息,只要改改版本和名字,其他的信息基本不需要动。

关键的信息还有:

  • s.require_paths定义了插件核心文件的位置
  • s.add_runtime_dependency 定义了插件运行的环境

然后再看看logstash-filter-example.rb

这个文件就需要详细说说了,基本的框架如下,

# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"

class LogStash::Filters::Example < LogStash::Filters::Base
  config_name "example"
  config :name,:validate =>:string,:default =>"xingoo!"

  public
  def register
  end

  public
  def filter(event)
    event["name"] = @name
    filter_matched(event)
  end
end 

挨行看看!

首先第一行的# encoding: utf-8,不要以为是注释就没什么作用。它定义了插件的编码方式。

下面两行:

require "logstash/filters/base"
require "logstash/namespace"

引入了插件必备的包。

class LogStash::Filters::Example < LogStash::Filters::Base
  config_name "example"

插件继承自Base基类,并配置插件的使用名称。

下面的一行对参数做了配置,参数有很多的配置属性,完整的如下:

 config :variable_name,:validate =>:variable_type,:default =>"Default value",:required => boolean,:deprecated => boolean

其中

  • variable_name就是参数的名称了。
  • validate 定义是否进行校验,如果不是指定的类型,在logstash -f xxx --configtest的时候就会报错。它支持多种数据类型,比如:string:password:boolean:number:array:hash:path (a file-system path):codec (since 1.2.0):bytes.
  • default 定义参数的默认值
  • required 定义参数是否是必须值
  • deprecated 定义参数的额外信息,比如一个参数不再推荐使用了,就可以通过它给出提示!典型的就是es-output里面的Index_type,当使用这个参数时,就会给出提示:
config :index_type, :validate => :string, :deprecated => "Please use the 'document_type' setting instead. It has the same effect, but is more appropriately named."

下面的两个方法是插件的核心了!

register方法相当于初始化的构造方法,可以在里面进行插件的初始化工作。

filter中则是过滤器的核心代码。

其中event是从input插件中传入的事件对象,它是Logstash::Event的对象,在logstashj-core包中,有兴趣的可以了解一下!

然后在这个方法中可以使用几个默认的方法;

  • filter_matched(),该方法会把事件传入下一个过滤器
  • add_field、`remove_field 添加或者移除一个字段
  • add_tagsremove_tags 添加或者移除一个标签
  • event.cancel 取消当前的事件,即不在继续向下走。(在split插件中有典型的使用场景)

在上面的例子中,定义了一个name参数,在register中使用@name实例变量,把参数赋值给event对象。

这个插件的目的就是给每条事件都加上一个name属性。

至此一个插件就算编写完成了!

安装插件

第一步,首先把这个插件文件夹拷贝到下面的目录中

logstash-2.1.0\vendor\bundle\jruby\1.9\gems

第二步,修改logstash根目录下的Gemfile,添加如下的内容:

gem "logstash-filter-example", :path => "vendor/bundle/jruby/1.9/gems/logstash-filter-example-1.0.0"

第三步,编写配置文件,test.conf

input{
    stdin{

    }
}
filter{
    example{
        name => "test name:xingoo"
    }
}
output{
    stdout{
        codec => rubydebug
    }
}

第四步,输入logstash -f test.conf时,输入任意字符,回车~~~大功告成!

是不是,没有想象中的那么难?要想要熟练的编写更复杂的插件,还需要多看官方插件的源码!

参考

How to write a Logstash filter plugin

本文转自博客园xingoo的博客,原文链接:手把手教你编写Logstash插件,如需转载请自行联系原博主。

时间: 2024-07-30 03:16:16

手把手教你编写Logstash插件的相关文章

手把手教你编写入门级redis客户端

Redis是开源的.基于内存的数据结构存储系统,可用作数据库.缓存以及消息代理方面.Redis支持许多种数据结构,并内置了丰富的诸如冗余.脚本.事务.持久化等功能,深受业界喜爱,被各种业务系统广泛使用.为了方便使用,Redis官网推荐了针对各种编程语言的多种客户端,支持java.c#.python.c++等主流编程语言.那么大家会问,既然Redis客户端已经这么丰富了,为什么还要尝试自己编写客户端?我的看法是,知己知彼,自己尝试制作Redis客户端,不仅可以加深对Redis的了解,而且可以通晓R

手把手教你编写基于PHP扩展库的后门教程

0x00 前言 今天我们将讨论编写基于PHP扩展库的后门.通常来说,大部分入侵者都会在脚本中留下自定义代码块后门.当然,这些东西很容易通过源代码的静态或动态分析找到. 利用PHP扩展库的好处显而易见: 1很难寻找 绕过disable_functions选项 有能力控制所有的代码 访问代码执行的API 但是我们需要有编辑PHP配置文件的能力. 0x01 细节 //[译者注:用linux两条命令搞定了,何必windows费这么大劲] 作为例子,我会用Windows来写.写扩展我用的Visual St

手把手教你编写-微信机器人

一. 引言       我们都知道微信提供了多种登录的方式包括手机端.电脑端以及web端.       web端的登录我们用Python程序完全可以模拟出来~~如果你不知道那也没关系稍微了解下Python request session即可       而所谓的机器人实际上就是后台一个智能的程序类似"微软小冰""iPhone siri".今天我们要用的是一个开放的机器人API"图灵机器人"       下面就让我们一步步分析如何通过模拟web端微

【手把手教你Maven】构建过程

转载自:http://www.cnblogs.com/xing901022/p/5002037.html [手把手教你Maven]构建过程 Maven是一款进行 依赖管理.项目构建.信息管理 为一体的工具. 它不像Make具有复杂的命令.也不像Ant需要手动编写大量的重复代码就能进行项目的构建: 还能提供强大的依赖库管理,避免jar包混乱与冲突: 还可以方便的管理项目的信息.知识产权等内容. 本篇的写作目的在于帮助那些之前没有使用过,或者是对maven还没有太多概念的朋友,学会使用maven,利

手把手教你将Vim改装成一个IDE编程环境(图文) 吴垠_相关技巧

By: 吴垠 Date: 2007-09-07 Version: 0.5 Email: lazy.fox.wu#gmail.com Homepage: http://blog.csdn.net/wooin Copyright: 该文章版权由吴垠和他可爱的老婆小包子所有.可在非商业目的下任意传播和复制.对于商业目的下对本文的任何行为需经作者同意. 联系方式:lazy.fox.wu#gmail.com 1 写在前面  Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛

手把手教你学Web Service

Well,各位观众,现在开始我的手把手交Visual Studio.net的第一课―-手把手教你学Web Service.有没有下一课还得看诸位看官的反应了!我们知道,在MS新一代战略.net中,Web Service占了一个相当次大的份量,为什么这样说那?那是因为Web Service 是未来编程的新 思路,他将编程由本机扩大到了Internet上,他通过一个proxy.dll就可以访问在Internet上 提供的Service,并且就像在本机上操作一样方便,其实,Web Service也可以

完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

转载自 PiggyXP(小猪) 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三 手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                              ----- By PiggyXP(小猪) 前 言         本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中

【中间件3】手把手教你在UbuntuKylin安装配置开源版Tair(请指教)

一 相关资源 1 操作系统环境 2 Tair 资源 二 安装步骤2 1 关闭防火墙3 2 安装工具 3 设置库文件的安装目录 4 编译安装 Tair依赖库tb-common-utils 5 编译安装 Tair 6 配置和启动 tair 三 启动步骤 一 相关资源 1.1 操作系统环境 UbuntuKylin 16.04 64位(x86_64),官方一定要64位的.1 1.2 Tair 资源 Tair 代码 SVN 地址:http://code.taobao.org/svn/tair/trunk/

手把手教你Android来去电通话自动录音的方法

原文:手把手教你Android来去电通话自动录音的方法 http://www.jizhuomi.com/android/example/354.html 我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能.        来去电自动录音的关键在于如何监听手机电话状态的转变:        1)来电的状态的转换如下(红色标记是我们要用到的状态)        空闲(IDEL)